創建子類實例前,必須先完成父類部分的初始化。Java 強制要求子類構造器的第一條語句顯式或隱式調用父類構造器。
class Base {}
class Derived extends Base {
public static void main(String[] args) {
new Derived(); // 編譯器自動插入 super(),調用 Base(),正常運行
}
}
class Base {
Base(int i) { System.out.println("Base(int)"); }
}
class Derived extends Base {
Derived() { System.out.println("Derived()"); } // 編譯錯誤:找不到 Base()
public static void main(String[] args) { new Derived(); }
}
編譯錯誤:cannot resolve symbol: constructor Base()。父類一旦定義任意構造器,編譯器不再生成無參構造器,子類必須顯式調用 super(int)。
class Base {
Base() { System.out.println("Base()"); }
Base(int i) { System.out.println("Base(int): " + i); }
}
class Derived extends Base {
Derived() { super(8); System.out.println("Derived()"); }
Derived(int i) { super(i); System.out.println("Derived(int): " + i); }
public static void main(String[] args) {
new Derived(); // 輸出:Base(int): 8 → Derived()
new Derived(9); // 輸出:Base(int): 9 → Derived(int): 9
}
}
super(8) 表示調用 Base(int) 並傳遞常量 8;super(i) 傳遞子類構造器參數。
Base(),子類隱式 super() 正常super(...) 調用現有父類構造器super(),帶參構造器仍需顯式 super(...) 若不想用無參版this(...) 調用本類其他構造器,最終仍會鏈式到達某個 super(...)protected),降低子類編寫負擔