抽象類別

      在〈抽象類別〉中尚無留言

抽象類別(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) {}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *