抽象類別(Abstract classes)
抽象類別的目的有二個
1. 禁止類別 new 出物件
2. 規範繼承的子類別必需遵循的契約
為什麼要禁止類別new 出物件呢? 比如Pokemon, 它是所有神奇寶貝的統稱, 是一個抽象的名詞. 如果可以new 出 Pokemon的話, 那請問它應該長什麼樣子呢?? 所以Pokemon 生出物件本身就沒什麼意義, 所以就要把Pokemon定義為抽象類別.
public abstract class Pokemon{
public abstract char getColor();
}
抽象方法
方法也可以是抽象的, 如下藍色的地方
abstract class Pokemon{ public int level; public abstract void setLevel(int l); } class Pikachu extends Pokemon{ @Override public void setLevel(int level) { } }
抽象類別總結
1. 子類別繼承抽象類別時, 一定要實作抽象方法, 可以按Alt+Enter讓NetBeans幫我們加入.
2. 若子類別不實作父類別抽象方法, 則子類別也必需標示為抽象方法.
3. 抽象方法只能是方法原型宣告, 不可以有實体代碼(上方藍色部份).
4. 子類別實作抽象方法時, 其參數名稱不一定要跟抽象方法參數名稱一樣, 如上面紅色的部份. 但抽象方法的參數名稱(如上面的 int l)一定要寫, 這是Java的腦殘設計.
5. 抽象類別不一定要有抽象方法. 但如果有抽象方法, 則類別一定要宣告為抽象類別
權限
抽象方法不可以為private. 因為抽象方法是為了讓繼承者遵循必定的合約, 即然要別人遵守, 然後又不公佈合約的內容, 這就矛盾了. 所以抽象方法只能為protected, 預設, 或public
另外子類別實作抽象方法時, 子類別的方法權限必需等於或寬於抽象方法的權限. 如下面代碼中, 因為父類別的抽象方法是protected, 所以藍色的那行必需是protected或public, 不能是預設權限
abstract class Pokemon{
public int level;
protected abstract void setLevel(int l);
}
class Pikachu extends Pokemon{
@Override
public void setLevel(int level) {}
}