Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java & OOP Core Concept

Avatar for Pinlun Pinlun
March 23, 2017

Java & OOP Core Concept

Java & OOP Core Concept

Avatar for Pinlun

Pinlun

March 23, 2017

Other Decks in Programming

Transcript

  1. CLASS DEFINITION • 類別 Class 是Java的語言核心 • 每個 Java Program

    都是一個或多個 Class 組成 • How to use classes ? • Scanner keyboard; • How to create objects from classes ? • Keyboard = new String(); • How to invoke their methods ? • keyboard.nextInt(); 3
  2. CLASS DEFINITION • 一個 class 可以包含多個不同 data • 變數 variables.

    methods (可看作 C 的副程式) int a; int b; float c; a = 1; b = 2; c = 4.5; a = 6; b = 4; c = 8.6; Object 1 Object 2 new new Class 4
  3. CREATE OBJECTS • An object of a class is named

    or declared by a variable of the class type: • Date object1; • Use new operator is to create the object and associate it with its variable name: • object1 = new Date(); • These can be combined as follows: • Date object1 = new Date(); • Date object2 = new Date(); String month; int day; int year; writeOutput() month = May; day = 6; year = 1994; month = October; day = 25; year = 1990; object1 object2 new new Date 6
  4. METHODS • Includes two parts: • Heading • Method body

    Heading body 最重要的是這個回傳值宣告 當method動作最後有 return ___; 取決於回傳了什麼東西 回傳 int 就要寫 int 回傳 String 就要寫 String 如沒有回傳 也要寫 void 8
  5. USE VARIABLES & INVOKE METHODS • 在主程式中怎麼使用不同 objects 的變數 •

    object1.month; • object2.day; • 呼叫 methods • object1.writeOutput(); String month; int day; int year; writeOutput(); month = May; day = 6; year = 1994; month = October; day = 25; year = 1990; object1 object2 new new Demo 9
  6. CLASS VARIABLE VS INSTANCE VARIABLE • 類別變數 Class Variable •

    顧名思義, 是宣告在 Class 中的變數 • 其值只有一個記憶體空間, 也就是值只會有一個 • 實例變數 Instance Variable • 當你用寫好的 class 來 new objects • Objects 會有自己的變數, 這些變數就是實例變數 • 與類別變數不同, 不同 objects 的實例變數即使名稱一樣, 各自有不同記憶體空間 • 可以有不同的值 • 所以在呼叫使用時要明確指出是呼叫哪個 objects 的哪個變數 10
  7. FILE NAME & LOCATION public class 名稱必須跟 Java 檔名相符 Q:

    一個Java檔案能不能寫多個 class? 可以, 但 public class 只能一個, 而且是主程式 main() 所在的class 11
  8. MAIN METHOD • main is a void method • When

    you run a Java program, Run-time system invokes the method main public static void main (String[] args) { …… } 12
  9. LOCAL VARIABLES • 在 methods 中宣告的變數稱為 區域變數 Local variable •

    如果兩個 methods 擁有相同名字的區域變數? • They are still two entirely different variables public void method_a() { int a; … } public void method_b() { int a; … } 兩個 a 是不同的 13 Local Instance Class 三種 variables 各自不同
  10. THIS PARAMETER • 什麼時候會用到 this ? 當 methods 的參數(parameters) 跟

    class 的變數名稱一 樣 public class Date { String month; int day; int year; public void setDate(String month, int day, int year) { this.month = month; this.day = day; this.year = year; } } Q: 等號哪一側的 month. day. year 才是 Date 的 variables ? 15
  11. HIDING & ENCAPSULATION • 封裝 Encapsulation 就是很好的藏匿資料方法 • 所謂封裝, 就是將

    data (variables) & methods 整合在 一個程式碼區塊 也就是 class 中 Q: 如何封裝? A: Marking them private 18
  12. PRIVATE 將 Classes. Variables. Methods 寫成 private 代表在此 class 外的

    classes 無法直接存取 19 DateTry date = new Demo( ); (1) date.month = “January”; (2) date.day = 1; (3) date.year = 2008; (4) date.writeOutput( ); (5) date.getDay( ); Another class 這五行code哪裡錯?
  13. Make all instance variables be private Make most methods be

    public 換句話說, 不論是改變或存取 private 變數 都用 methods 實作 20 GOOD IMPLEMENTATION OF ENCAPSULATION GOOD IMPLEMENTATION OF ENCAPSULATION
  14. ACCESSOR & MUTATOR METHODS • 既然要用 methods 來存取.改變變數的值, 實際要怎麼做? •

    Accessor (Getter) & Mutator (Setter) Methods • Accessor Methods 存取 private variables 的值 • Ex: getInfo( ) • Mutator Methods 則更改 private variables 的值 • Ex: setInfo(…) 21 int getA( ) { return a; } // Accessor method void setA(int p) { a = p; } // Mutator method int getB( ) { return b; } // Accessor method void setB(int p) { b = p; } // Mutator method float getC( ) { return c; } // Accessor method void setC(float p) { c = p; } // Mutator method private int a; private int b; private float c; class
  15. CAN NOT OVERLOAD BASED ON THE TYPE RETURNED • 多載

    Overload 只限用在 methods 名稱一樣! • 如果傳回值型態不同, 就無法多載! 要另寫名稱不同的 methods 23 public int getDate( ) { } public String getDate( ) { }
  16. CONSTRUCTOR • 建構子 Constructor 是 Class 中很重要的寫法 • 建構子是一種特別的 method

    • 用來初始化 new object 的變數 • 建構子名稱必須和歸屬的 class 名稱一樣 • 沒有回傳值 • Class 中的建構子, 都會用 多載 寫很多種初始化變數的可能 25
  17. CONSTRUCTOR • 為何要使用建構子? • 這個問題前應該要先從這個問起: • new objects 的時候, 實例變數

    Instance Variables 已初始化在記憶體了嗎? • 實例變數 Instance Variables 會自動被Java 初始化放在記憶體中 • 區域變數 Local Variables 不會被初始化 (In methods) • 既然會被初始化, 那初始值就是個問題 • Boolean 型態初始值為 false • Class 型態初始值為 null • 其他型態初始值為 zero 26
  18. CONSTRUCTOR • 當一個新 object 建立的時候, 呼叫建構子初始化物件 • Date object1 =

    new Date(5, 6, 1990); • Date object2 = new Date(May, 6, 1990); • Date object3 = new Date(1994); • 呼叫建構子只有這種寫法 • object1.Date() 不是這樣用 28
  19. STATIC TYPE • Static (靜態) Methods • 意思指 在不同 Class

    可以直接呼叫, 不用 new objects 才呼叫 31 (1) Round.area(radius) (2) Round.volume(radius) Round r = new Round(); (3) r.volume(radius) Q: 哪幾個執行後不會有錯?
  20. ERROR WHEN INVOKE • Static methods 不能呼叫非靜態的 methods 或是非靜態的 variables

    • 但 Static methods 可以互相呼叫 32 void method1( ) { B myobj = new B( ); myobj.method2( ); } void static method2( ) { B.method1( ); } void static method3( ) { this.method1( ) } void static method1( ) { } void method2( ) { } Class B Class A 1 2 3 4 5 哪個錯?
  21. STATIC VARIABLES • Static variables 靜態變數 只屬於該 class • 而不是屬於從

    class 所 new 的 objects • 所有 Class objects 都可以 存取 & 改變 靜態變數的值 • 如何宣告靜態變數? • Private static int myStaticVariable; 33
  22. STATIC VARIABLES • 靜態變數主要用在不同 Objects 之間傳遞 data 34 static int

    a; int b; Class myClass b = 10; b = 5; b = 3; b = 1; obj1 obj2 obj3 obj4
  23. STATIC VARIABLES • 靜態變數 Static methods 建議須宣告時就設為 private • 除非它同時是一個不會變的常數

    • 如果靜態變數同時也是個不會變的常數, 在宣告時建議加上 final • 以防設為 public 而被呼叫到改變其值 • public static final int BIRTH_YEAR = 1994; • 呼叫使用 • int year = ClassName.BIRTH_YEAR; 35
  24. INHERITANCE • 繼承 Inheritance 是 物件導向程式 Object-Oriented Programming 中最重要的核心 •

    Ex: Java. C++ 都是物件導向語言的一種 • 主要的好處是, 可以先定義一個基本的 Class 作為架構 • 之後再繼承它, 加入更多的變數以及 methods 38
  25. INHERITANCE • 被繼承的 Class 稱為父類別 (Base class) • 繼承父類別而新產生的 Class

    稱為子類別 (Derived class) • 子類別繼承時會自動繼承擁有父類別所有的變數以及 public methods • 而在子類別中, 也可以新設計更多的變數以及 methods • 繼承最大的好處是 重複使用程式碼, 代替複製程式碼到新類別的步驟 • Ex: 程式更新 39
  26. INHERITANCE VARIABLES 42 String name; int hireDate; int hours; int

    Salaryrate; Employee HourlyEmployee 繼承 Inherit HourlyEmployee class 一樣有 name. hireDate 兩個變數 但在 class 中不會再宣告一次
  27. WHAT IS INHERITED? • 子類別繼承時繼承了多少東西? • public methods • All

    public and private instance variables • All public and private static variables • private methods ? • 沒有被繼承 43
  28. OVERRIDE • 雖然子類別會繼承父類別幾乎所有的 methods • 但在子類別設計時, 也可以改寫繼承自父類別的 methods, 以符合子類別的需求 •

    這個動作就叫 Override 覆寫 45 String name; int hireDate; public int getSalary() { definition① } int hours; int Salaryrate; public int getSalary() { definition② } Employee HourlyEmployee 繼承 Inherit
  29. OVERRIDE VS OVERLOAD • 可能有點疑惑 • Override 覆寫 跟 Overload

    多載 不就很像嗎? • 複習一下 Overload 多載 • 在一個 class 中有多個相同名稱的 methods, 但有不同的參數 • Overload 只限用在 methods 名稱一樣! • 如果傳回值型態不同, 就無法多載! 46
  30. OVERRIDE VS OVERLOAD • 那 Override 有什麼不同? • Override 可說是除了名稱,

    跟原來的 methods 幾乎是完全不同的 • 傳回值型態可以不同? 可以 • 定義都是在子類別宣告, 而不是在父類別 (Overload 是在同一類別) • 參數可以不同? 可以, 但這樣就如同 Overload • 但是 Override 的 methods 前面可以用 @Annotation 方式標註 @Override • Android 裡面到處都是這種寫法 (@Override 會自動產生) 47
  31. OVERRIDE PRIVATE VS PUBLIC • private void doSomething() • public

    void doSomething() • public void doSomething() • private void doSomething() 48 Override OK Override WRONG!
  32. FINAL MODIFIER • 如果在 methods 前宣告 final • methods 無法被

    override • 如果 class 前宣告 final • 此 class 無法被繼承 • 當然更無法 override 其中的 methods 49
  33. SUPER CONSTRUCTOR • 如果父類別已有寫了建構子 • 那在子類別想要使用時要怎麼呼叫? • 使用 super (子類別建構子第一行就要先呼叫)

    50 public derivedClass(int p1, int p2, double p3) { super(p1, p2); instanceVariable = p3; } Constructor method(); Method1(); Constructor method(); super() Base Class Derived Class
  34. THIS CONSTRUCTOR • 那如果是在子類別內的建構子呢? • 在子類別自己想要使用時要怎麼呼叫? • 使用 this 51

    public ClassName(type1 param1, type2 param2) { … } public ClassName() { this(argument1, argument2); }
  35. THIS CONSTRUCTOR EXAMPLE 52 public class Employee { private String

    name; private Date hireDate; public Employee( ) { } public Employee(String theName, Date theDate) { } public Employee(Employee originalObject) { } } public class HourlyEmployee extends Employee { private double wageRate; private double hours; public HourlyEmployee( ) { this(“No name”, new Date(“January”, 1, 1000), 0, 0); } public HourlyEmployee(String theName, Date theDate, double theWageRate, double theHours) { } }
  36. INHERITANCE CLASS TYPE • 子類別不只會繼承父類別的變數及 methods • 連其形態 Type 會一並繼承

    53 A class obj1 B class obj2 C class obj3 A obj1 = new A( ); B obj2 = new B( ); C obj3 = new C( ); obj1 = obj2; (1) obj1 = obj3; (2) obj2 = obj3; (3) obj3 = obj1; (4) 哪個錯?
  37. DERIVED CLASS PRIVATE METHODS • 雖然子類別不會繼承父類別的 private methods, 還是可以用間接的方式呼叫 54

    private methodA() { … } public methodB() { methodA(); } In Base Class 間接呼叫 Invoke in derived class
  38. COMPARE & CONFUSE? • 如果 class 已寫好了幾個, 彼此間又有層層繼承關係 • 自己可能也不知道這個物件是從哪個

    class new 出來的 • 而 class 是繼承誰, 擁有誰的型態? • 使用 getClass() • object1.getClass() == object2.getClass() 55
  39. POLYMORPHISM • There are three main programming mechanisms that constitute

    object-oriented programming (OOP) • Encapsulation 封裝 (資料藏匿) • Inheritance 繼承 • Polymorphism 多型 • Polymorphism 多型 • 意思指程式語言設計讓一個 method 可以有多種不同的實作方式 • 主要作法 • Late Binding • Dynamic Binding 58
  40. DYNAMIC BINDING • Dynamic Binding 動態連結, 也可稱為 Late Binding 晚期(後期)連結

    • 編譯時, Methods 宣告 (名稱) 與 Methods 執行內容 (實際執行的程式碼) • 並非在編譯時就連結起來 • 如在編譯時就已連結, 稱為 Early Binding 早期連結 • 如有宣告 final. private. static, 就會在編譯時連結 • 那何時才真正連結起來? • At Run Time, 也就是真的呼叫到且執行的時候 • Why? • 因為 Overload & Override 59
  41. BINDING EXAMPLE 60 Employee obj1 = new Employee( ); HourlyEmployee

    obj2 = new HourlyEmployee( ); obj1 = obj2; obj1.m1(); Employee obj1 = new Employee( ); HourlyEmployee obj2 = new HourlyEmployee( ); obj1.m1(); 假設 Employee & HourlyEmployee 兩個類別都有 m1() Q: 哪個 obj1.m1() 呼叫 Employee 中的 m1 method?
  42. ABSTRACT CLASS • Abstract class 抽象類別 • 指一個類別中有尚未被完整定義的 methods •

    不能用抽象類別來 new objects • 但可以將抽象類別當作父類別來繼承之 61
  43. ABSTRACT METHOD • Abstract methods are like placeholder for methods

    that will be fully defined in descendent classes • 不能宣告為 private 62
  44. EXAMPLE 63 public abstract class Employee { private String name;

    private Date hireDate; public abstract double getPay( ); } public class HourlyEmployee extends Employee { private double payRate; private double hours; public double getPay( ) { return payRate * hours; } } public static void main(String args[]) { Employee tony = new Employee( ); ERROR!! HourlyEmployee joe = new HourlyEmployee( ); } public class SalaryEmployee extends Employee { private double salary; private double hours; public double getPay( ) { return salary / 12; } }
  45. INTERFACE • 介面 Interface 可以說是一種抽象類別 Abstract Class 的極端例子 • 但是!

    介面並不是一個類別 • 介面裡包含多個 methods, 但就如抽象類別, methods 並不會完整定義 • 介面裡的 methods 必須宣告為 public 66
  46. IMPLEMENTS • 當要在某個class實作介面 • class className extends baseclass implements Interface1,

    Interface2 • 一個 class 只能繼承一個父類別, 但可以實作很多介面 • 不同的是 • 當繼承一個父類別, 繼承的 methods 如果不覆寫(Override) 可以直接沿用就好 • 如果是繼承抽象類別, 不定義所有 methods, 該類別也是抽象的 • 但介面算是一種極端的抽象類別, 實作時一定要定義完整的 methods 68