2007年11月8日 星期四

Head First Java 讀後整理(5) - Serious Polymorphism

1、有些 class 不應該被初始化,可透過在 class 前面使用「abstract」關鍵字達成
Animal ani = new Animal();  //這樣是一件很奇怪的事情

2、除了 class 之外,也可以將 method 標示為 abstract
public abstract void eat(); //沒有實作! 直接以分號結束

3、abstract class 代表此 class 必須要被 extend 過,而 abstract method 代表此 method 一定要被 override 過

4、abstract class 可以帶有 abstract method 或是 non-abstract method

5、若 class 中帶有 abstract method,則此 class 必須也是 abastract

6、有時就是沒辦法為所有 subclass 寫出有意義的共通程式碼,但還是可透過 abstract 定義出共通的協定 => 最終目的就是「polymorphism」

7、abstract method 沒有內容,它只是為了標釋出 polymorphism 的部分而存在

8、而繼承 abstract class 的 concrete class,必須要實作出所有的 abstract method (其實還是可以透過 abstract 將實作再度轉移給下一層 concrete class)
9、Java 中所有的 class 都是由 Object class 所 extend 出來的,因此使用 polymorphism 機制時可適時使用 Object 作為 argument 或 return type

10、承上,ArrayList 可以處理任何 class 的秘密在於他所用的 argument 與 return type 為 Object

11、Object 除了 polymorphism 外,還提供 Java 在 run-time 期間對任何 object 都有需要的 method 提供實作程式碼

10、任何從 ArrayList<Object> 取出的東西都會被 compiler 認為是 Object 型態的參考 (因此僅能使用 Object class 中所定義的 method)
ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
Dog d = myDogArrayList.get(0); //compiler 會提示錯誤,因為從 ArrayList 取出的為 Object 而非 Dog

11、若確定 Object 原來的 type,還是可以轉換為原來的 type
Object o = a1.get(0);
Dog d = (Dog)o; //轉換為原來 type
d.bark(); //此時就可以使用 Dog class 才有的 method

12、interface 本身帶有 public 與 abstract 的意義,因此這兩個關鍵字可以省略

13、實作某 interface 的 class 必須實作出它所有的 method,因為這些 method 都是 public && abstract

14、若以 interface 取代 concrete subclass 或 abstract superclass 作為 argument 或 return type,就可以傳入任何實作該 interface 的東西

15、class 僅能繼承一個 class,但卻能實作多個 interface

沒有留言:

張貼留言