首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 內部類能否被覆寫?繼承內部類的正確姿勢

     編輯:Java 相關知識

直接「覆寫」內部類無效

衍生外部類時,內部類不會自動繼承/覆寫。示例:

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()

關鍵點

  1. BigEgg2.Yolk extends Egg2.Yolk 顯式建立繼承關係。
  2. 基類提供 insertYolk() 等注入方法,衍生類構造器中調用注入自定義內部類實例。
  3. 基類構造器先創建默認 Yolk,衍生類構造器再替換——雙重創建略有開銷,但實現了邏輯覆寫。

結論

內部類無法像方法那樣隱式覆寫。需「顯式繼承內部類 + 外部類提供注入點」雙管齊下,才能實現衍生類自定義內部類行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved