Java 單繼承機制為保證數據安全,但現實建模常需「多重繼承」(如子女同時繼承父母特徵)。Java 提供兩種曲線實現方案:接口與內部類。
類可實現多個接口,接口無狀態、無實現,天然避免鑽石繼承衝突。
interface CanFight { void fight(); }
interface CanSwim { void swim(); }
interface CanFly { void fly(); }
class ActionCharacter { public void fight() {} }
class Hero extends ActionCharacter implements CanFight, CanFly, CanSwim {
public void fly() {}
public void swim() {}
// fight() 繼承自父類,無需重寫
}
優點:語法簡單、符合「面向接口編程」。局限:父類若為具體/抽象類(而非接口),無法繼承其實現邏輯。
內部類可獨立繼承與外部類無關的類,外部類通過組合多個內部類實例,「代理」其行為,實現多重繼承效果。
class Father { public int strong() { return 9; } }
class Mother { public int kind() { return 8; } }
class Son {
class FatherImpl extends Father {
public int strong() { return super.strong() + 1; } // 更強
}
class MotherImpl extends Mother {
public int kind() { return super.kind() - 2; } // 稍不溫柔
}
public int getStrong() { return new FatherImpl().strong(); }
public int getKind() { return new MotherImpl().kind(); }
}
測試:Son 同時擁有父親的強壯(+1)與母親的溫柔(-2)。
內部類持有外部類引用,但繼承關係獨立於外部類。每個內部類單獨繼承一個父類,外部類通過委託調用內部類方法,彌補單繼承不足。
| 場景 | 推薦方案 | 理由 |
|---|---|---|
| 僅需多行為規範,無狀態共享 | 接口 | 輕量、解耦、標準做法 |
| 需繼承多個具體/抽象類的實現邏輯 | 內部類 | 唯一可行途徑 |
接口解決「類型繼承」,內部類解決「實現繼承」。兩者結合,使 Java 在單繼承約束下仍具備強大的建模表達力。