Chapter 9 Abstract Classes and Interfaces
1. 抽象類不能創建任何實例,但可以被當作數據類型使用,因此可以創建抽象類類型的數組
ClassAbstract[] example = new ClassAbstract[];
2. 含有抽象方法的類必須被聲名為抽象類,但抽象類不一定必須包含抽象方法。
作為抽象類的子類,如果沒有實現(implement)所有的抽象方法,也只能被聲名為抽象類。
抽象類也可以有自己的構造函數,以便被子類繼承。
3. 子類可以重載父類的方法,并把它定義為抽象的。盡管這很少見,但是當父類的方法在子類中變得不可用時,就必須這么做。
4. 上一章跳過的一個概念:Hiding Data Fields and Static Methods
子類無法重載父類的數據域(無論靜態與否)或靜態方法,當你在子類中定義了同名的變量或是靜態方法的時候,原來的方法或變量就被隱藏了,但仍然存在,訪問它們有兩種方法,一種是用super關鍵字,另一種就是通過父類的reference訪問。
例如
class Animal {
public String news = "Animal's news";
public static String smile() {
return "smile from Animal";
}
}
class Tiger extends Animal {
public String news = "Tiger's news";
public static String smile() {
return "smile for Tiger";
}
}
x.news 為 Animal's news
x.simle() 返回 smile from Animal
只有將x造型(casting)為Tiger時,才會返回Tiger的內容。
但是實例方法(instance method)不存在這個現象。
5. Calendar 類及其子類
6. 接口 Interface
interface是一種類似于class的結構,且只包含常數和抽象方法。
如java.lang.Comparable
package java.lang;
public interface Comparable {
public int compareTo(Object o);
}
max方法用來取兩個對象中較大的那一個:
public class Max {
public static Object max(Object o1, Object o2) {
if (((Comparable)o1).compareTo(o2) < 0)
return o1;
else
return o2;
}
}
使用max:以字符串為例
String s1 = "abcde";
String s2 = "abcdg";
String s3 = (String)Max.max(s1, s2);
(Comparable)o1 告訴編譯器,把o1轉型為Comparable以便于調用comepareTo方法。