Java 對象創建過程中構造函數的執行順序、父子類調用規則、多構造函數選擇機制是初學者常見困惑點。本文系統梳理三大核心問題,配合代碼示例徹底講透。
答案:是的,必然執行。 Java 規定子類構造過程必須先完成父類初始化。即使子類構造函數不顯式調用 super(),編譯器也會隱式插入無參 super() 調用。繼承鏈越深,構造函數調用鏈越長,均自 Object 向下依次執行。
機制:JVM 沿繼承鏈向上尋找至 Object,再從 Object 向下依次執行構造函數。
Object → GrandParent → Parent → Child
設計意圖:確保父類成員在子類構造函數執行前已完成初始化,子類邏輯可安全訪問繼承字段。
super(參數) 顯式指定調用父類哪個構造函數super(...),編譯器隱式插入 super() 調用無參構造函數super(參數),否則編譯報錯
public class SuperClass {
public SuperClass() {
System.out.println("super class constructed.");
}
public SuperClass(String name) {
System.out.println("super class constructed with name: " + name);
}
}
public class SubClass extends SuperClass {
public SubClass() {
// 隱式調用 super()
System.out.println("sub class constructed.");
}
public SubClass(String name) {
// 顯式調用父類帶參構造函數
super(name);
System.out.println("sub class constructed with name: " + name);
}
public static void main(String[] args) {
System.out.println("=== new SubClass() ===");
new SubClass();
System.out.println("\n=== new SubClass(\"world\") ===");
new SubClass("world");
}
}
=== new SubClass() ===
super class constructed.
sub class constructed.
=== new SubClass("world") ===
super class constructed with name: world
sub class constructed with name: world
| 場景 | 調用的父類構造函數 | 備註 |
|---|---|---|
| 子類無構造函數 | 父類無參構造函數 | 編譯器生成默認無參構造函數,隱式 super() |
| 子類有無參構造函數,無 super() | 父類無參構造函數 | 隱式 super() |
| 子類構造函數首行 super(name) | 父類匹配參數的構造函數 | 顯式指定 |
| 子類構造函數首行 this(...) | 委托的兄弟構造函數決定 | 鏈式調用,最終必有一個調用 super() |
| 父類只有帶參構造函數 | 子類必須顯式 super(參數) | 否則編譯錯誤:Implicit super constructor undefined |
Object掌握構造函數執行機制,能避免「父類字段未初始化就被子類使用」等隱蔽 Bug,也是理解繼承體系初始化協議的基石。