Java 為了簡化物件模型、避免鑽石繼承問題,**類別僅支援單一繼承** (extends 一個父類別)。但現實領域常需「一個物件擁有多重身分/行為」,Java 提供兩種標準方案:
implements 多個)。
interface Flyable { void fly(); }
interface Swimmable { void swim(); }
interface Fightable { void fight(); }
class ActionHero {
void fight() { System.out.println("Basic fight"); }
}
class SuperHero extends ActionHero implements Flyable, Swimmable, Fightable {
public void fly() { System.out.println("Flying!"); }
public void swim() { System.out.println("Swimming!"); }
// fight() 繼承自 ActionHero,可選擇覆寫
}
Interface.super.method()。當需要繼承**多個具體類別** (含狀態、建構子) 時,介面無能為力,需用內部類:
class Father { int strong() { return 9; } }
class Mother { int kind() { return 8; } }
class Son {
// 內部類各自繼承不同父類別
class FatherSide extends Father {
@Override int strong() { return super.strong() + 1; } // 更強
}
class MotherSide extends Mother {
@Override int kind() { return super.kind() - 2; } // 較不溫柔
}
// 對外暴露組合行為
int getStrong() { return new FatherSide().strong(); }
int getKind() { return new MotherSide().kind(); }
}
Son.this),可存取外部類私有成員。| 維度 | 介面 | 內部類 |
|---|---|---|
| 繼承目標 | 介面 (契約) | 類別 (具體/抽象) |
| 狀態 | 無 (Java 8 前) / default 方法共享邏輯 | 各自擁有完整繼承狀態 |
| 建構子 | 無 | 各自呼叫父類建構子 |
| 鑽石問題 | 無 (介面無狀態) / default 衝突需顯式解決 | 無 (各內部類獨立繼承) |
| 外部類存取 | 無隱含關聯 | 內部類持有外部引用 |
| 複雜度 | 低 | 中 (需管理內部類實例) |
| 現代建議 | **首選** | 僅當必須繼承類別時 |