抽象方法、抽象類別


重新定義實作 的範例中,Role類別的定義裏fight()方法區塊實際上沒有撰寫任何程式碼,雖然滿足了多型需求,但會引發的問題是,你沒有任何方式強迫或提示子類別一定要實作fight()方法,只能口頭或在文件上告知,不過如果有人沒有傳達到、沒有看文件或文件看漏了呢?

如果某方法區塊中真的沒有任何程式碼實作,可以使用abstract標示該方法為抽象方法(Abstract method),該方法不用撰寫{}區塊,直接;結束即可。例如:

package cc.openhome;

public abstract class Role {
    ...略
    public abstract void fight();
}

類別中若有方法沒有實作,並且標示為abstract,表示這個類別定義不完整,定義不完整的類別就不能用來生成實例,這就好比設計圖不完整,不能用來生產成品一樣。Java中規定內含抽象方法的類別,一定要在class前標示abstract,如上例所示,這表示這是一個定義不完整的抽象類別(Abstract class)。如果嘗試用抽象類別建構實例,就會引發編譯錯誤:

不能實例化抽象類別


子類別如果繼承抽象類別,對於抽象方法有兩種作法,一種作法是繼續標示該方法為abstract(該子類別因此也是個抽象類別,必須在class前標示abstract),另一個作法就是實作抽象方法。如果兩個作法都沒實施,就會引發編譯錯誤:

沒有實作抽象方法


子類別可以重新定義父類別的方法,重新定義時可以重新標示具體方法為抽象abstract,並令該方法沒有實作(當然該子類別就也得標上abstract),如果又有類別繼承該子類別,就得實作該抽象方法。