重新定義實作 的範例中,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
),如果又有類別繼承該子類別,就得實作該抽象方法。