使用 new 關鍵字創建子類實例時,執行順序鐵律:
若父類無無參構造函數,子類**必須**在構造函數首行透過 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 先初始化父類部分(調用父類構造函數),再初始化子類部分,確保物件結構完整性。
super(...),編譯器自動插入 super()。@Override 註解標記覆寫方法,構造函數不適用。Java 繼承體系中,構造函數調用鏈遵循「由父到子、由無參到帶參」的順序。理解此機制有助於正確設計類初始化邏輯,避免 NullPointerException 或資料不一致問題。實務開發中,建議父類提供無參構造函數,子類按需顯式 super(...) 傳遞必要參數。