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

Java 繼承體系下的初始化順序深度解析:靜態塊、建構子與向上轉型

     編輯:Java 相關知識

實驗場景

定義父類 TestStatic 與子類 TestExtendStatic,均包含靜態變量、靜態塊、實例塊、構造器、普通方法與 main 方法。在子類 main 中通過向上轉型創建對象並調用被重寫的方法。

父類代碼

public class TestStatic {
    public static String name = "china";
    { System.out.println("========父類實例塊========"); }
    static { name = "England"; System.out.println("========父類靜態塊======"); }
    public TestStatic() { System.out.println("========父類構造器========"); }
    public static void main(String[] args) { System.out.println("========父類main========" + name); }
    public void test() { System.out.println("========父類test========"); }
}

子類代碼

public class TestExtendStatic extends TestStatic {
    { System.out.println("========子類實例塊========"); }
    static { System.out.println("========子類靜態塊======"); }
    public TestExtendStatic() { System.out.println("========子類構造器========"); }
    public void test() { System.out.println("========子類test========"); }
    public static void main(String[] args) {
        System.out.println("========子類main========" + name);
        TestStatic ts = new TestExtendStatic(); // 向上轉型
        ts.test();
    }
}

執行輸出與順序分析

========父類靜態塊======
========子類靜態塊======
========子類main========England
========父類實例塊========
========父類構造器========
========子類實例塊========
========子類構造器========
========子類test========

關鍵順序總結

  1. 父類靜態變量與靜態塊
  2. 子類靜態變量與靜態塊
  3. 子類 main 方法開始執行
  4. 創建子類對象觸發:父類實例塊 → 父類構造器 → 子類實例塊 → 子類構造器
  5. 向上轉型引用調用被重寫的 test(),實際執行子類版本

多次實例化與靜態塊單次執行驗證

在 main 中連續 new TestExtendStatic() 兩次,靜態塊僅首次執行,非靜態塊與構造器每次均執行。

直接實例化父類對比

若在子類 main 中執行 TestStatic ts = new TestStatic(),則不會加載子類靜態塊(除非主動引用子類),父類非靜態塊與構造器正常執行,調用 ts.test() 執行父類版本。

核心結論

  • 類加載階段:按繼承鏈自上而下執行靜態初始化。
  • 對象創建階段:按繼承鏈自上而下執行實例塊與構造器。
  • 向上轉型不影響初始化順序,多態方法調用在構造器完成後生效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved