衍生外部類時,內部類不會自動繼承/覆寫。示例:
class Egg {
protected class Yolk { Yolk() { println("Egg.Yolk()"); } }
private Yolk y;
Egg() { y = new Yolk(); }
}
class BigEgg extends Egg {
public class Yolk { Yolk() { println("BigEgg.Yolk()"); } } // 看似覆寫
}
new BigEgg(); // 輸出:New Egg() → Egg.Yolk()
基類構造器調用的是 Egg.Yolk,衍生類的 BigEgg.Yolk 完全被忽視。內部類不像方法那樣參與多態。
class Egg2 {
protected class Yolk { void f() { println("Egg2.Yolk.f()"); } }
private Yolk y = new Yolk();
Egg2() {}
void insertYolk(Yolk yy) { y = yy; } // 注入點
void g() { y.f(); }
}
class BigEgg2 extends Egg2 {
public class Yolk extends Egg2.Yolk { // 顯式繼承基類內部類
Yolk() { println("BigEgg2.Yolk()"); }
void f() { println("BigEgg2.Yolk.f()"); } // 覆寫方法
}
BigEgg2() { insertYolk(new Yolk()); } // 構造時注入自定義 Yolk
}
Egg2 e2 = new BigEgg2(); e2.g(); // 輸出 BigEgg2.Yolk.f()
BigEgg2.Yolk extends Egg2.Yolk 顯式建立繼承關係。insertYolk() 等注入方法,衍生類構造器中調用注入自定義內部類實例。Yolk,衍生類構造器再替換——雙重創建略有開銷,但實現了邏輯覆寫。內部類無法像方法那樣隱式覆寫。需「顯式繼承內部類 + 外部類提供注入點」雙管齊下,才能實現衍生類自定義內部類行為。