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

Java 類初始化順序深度解析:父類構造器鏈與子類實例化流程

     編輯:Java 相關知識

核心結論

類的構建過程是由內向外擴散的:子類初始化前,父類必須先完成初始化。

代碼驗證

class Art {
    Art() { System.out.println("Art"); }
}
class Drawing extends Art {
    Drawing() { System.out.println("Drawing"); }
}
public class Cartoon extends Drawing {
    Cartoon() { System.out.println("Cartoon"); }
    public static void main(String[] args) {
        Art cartoon = new Cartoon(); // 多態引用
    }
}

輸出結果

Art
Drawing
Cartoon

詳細流程解析

  1. new Cartoon() 調用 Cartoon 構造器。
  2. Cartoon 構造器隱式調用 super()(即 Drawing())。
  3. Drawing 構造器隱式調用 super()(即 Art())。
  4. Art 構造器執行,輸出 "Art"。
  5. 返回 Drawing 構造器繼續執行,輸出 "Drawing"。
  6. 返回 Cartoon 構造器繼續執行,輸出 "Cartoon"。
  7. 對象創建完成,引用賦給 Art 類型變量 cartoon。

關鍵點補充

  • 隱式 super(): 若構造器首行無顯式 this() 或 super(...),編譯器自動插入無參 super()。
  • 靜態初始化: 類加載階段按父類→子類順序執行靜態代碼塊/靜態字段初始化,早於構造器。
  • 實例初始化: 非靜態字段初始化、實例代碼塊在構造器 super() 調用後、構造器體前執行,同樣遵循父類優先。
  • 多態與構造器: 構造器不具有多態性,new Cartoon() 必須調用 Cartoon 構造器,但構造器鏈確保父類邏輯先執行。

最佳實踐建議

  1. 父類提供無參構造器,或子類顯式調用帶參 super(...)。
  2. 避免在構造器中調用可被覆寫的方法(子類字段未初始化時父類構造器已運行,導致 NPE 或邏輯錯誤)。
  3. 理解初始化順序,排查繼承體系中的依賴問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved