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

Java 父類與子類構造函數調用順序詳解

     編輯:Java 相關知識

核心規則

使用 new 關鍵字創建子類實例時,執行順序鐵律:

  1. 父類**無參構造函數**(隱式或顯式)
  2. 子類對應的構造函數

若父類無無參構造函數,子類**必須**在構造函數首行透過 super(參數) 顯式調用父類帶參構造函數,否則編譯報錯。

代碼驗證

父類

public class A_constructor {
    public A_constructor() {
        System.out.println("父類的無參數的構造函數 A_constructor()");
    }
    public A_constructor(int n) {
        System.out.println("父類帶參數的構造函數 A_constructor(n) : " + n);
    }
}

子類

public class B_constructor extends A_constructor {
    public B_constructor() {
        System.out.println("子類的無參數構造函數 B_constructor()");
    }
    public B_constructor(int n) {
        System.out.println("子類帶參數的構造函數 B_constructor(n): " + n);
    }
}

測試類

public class Test_constructor {
    public static void main(String[] args) {
        B_constructor one = new B_constructor();      // 無參
        B_constructor two = new B_constructor(2);     // 帶參
        System.out.println("測試結束");
    }
}

執行結果

父類的無參數的構造函數 A_constructor()
子類的無參數構造函數 B_constructor()
父類的無參數的構造函數 A_constructor()
子類帶參數的構造函數 B_constructor(n): 2
測試結束

關鍵觀察

  • 無論子類調用哪個構造函數,**父類無參構造函數總是優先執行**。
  • 子類帶參構造函數**不會自動調用父類帶參構造函數**,除非顯式寫 super(n)。
  • 若父類只有帶參構造函數,子類必須顯式 super(...),否則編譯失敗。

進階場景:顯式調用父類帶參構造函數

public class B_constructor extends A_constructor {
    public B_constructor(int n) {
        super(n * 2); // 顯式調用父類帶參構造函數,必須在第一行
        System.out.println("子類帶參數構造函數 B_constructor(n): " + n);
    }
}

執行 new B_constructor(2) 輸出:

父類帶參數的構造函數 A_constructor(n) : 4
子類帶參數的構造函數 B_constructor(n): 2

記憶體佈局視角

子類物件在堆記憶體中包含「父類部分」與「子類部分」。JVM 先初始化父類部分(調用父類構造函數),再初始化子類部分,確保物件結構完整性。

最佳實踐

  1. 父類**保留無參構造函數**(或不寫任何構造函數讓編譯器生成),降低子類耦合。
  2. 子類構造函數首行若無 super(...),編譯器自動插入 super()。
  3. 避免在構造函數中調用可被覆寫的方法(可能觸發子類未初始化欄位的邏輯)。
  4. 使用 @Override 註解標記覆寫方法,構造函數不適用。

總結

Java 繼承體系中,構造函數調用鏈遵循「由父到子、由無參到帶參」的順序。理解此機制有助於正確設計類初始化邏輯,避免 NullPointerException 或資料不一致問題。實務開發中,建議父類提供無參構造函數,子類按需顯式 super(...) 傳遞必要參數。

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