super(...),編譯器自動插入 super()(調用父類無參構造器)。super(args),否則編譯失敗。class SuperClass {
private int n;
// 無參構造器被註釋掉 → 父類無無參構造器
// SuperClass() { System.out.println("SuperClass()"); }
SuperClass(int n) {
System.out.println("SuperClass(int n): " + n);
this.n = n;
}
}
class SubClass extends SuperClass {
private int n;
// 1. 顯式調用父類帶參構造器
SubClass() {
super(300); // 必須首行
System.out.println("SubClass() 無參");
}
// 2. 顯式調用父類帶參構造器 + 子類帶參
SubClass(int n) {
super(n * 2); // 計算後傳給父類
System.out.println("SubClass(int n): " + n);
this.n = n;
}
// 3. 鏈式調用本類無參構造器
SubClass(String msg) {
this(100); // 調用 SubClass(int)
System.out.println("SubClass(String): " + msg);
}
}
public class TestSuperSub {
public static void main(String[] args) {
System.out.println("=== new SubClass(200) ===");
new SubClass(200);
System.out.println("\n=== new SubClass(\"Hello\") ===");
new SubClass("Hello");
}
}
=== new SubClass(200) ===
SuperClass(int n): 400 ← super(200*2)
SubClass(int n): 200
=== new SubClass("Hello") ===
SuperClass(int n): 200 ← this(100) → super(100*2)
SubClass(int n): 100
SubClass(String): Hello
class Parent { Parent(int x) {} }
class Child extends Parent {
Child() { } // 編譯錯誤:Implicit super constructor Parent() is undefined
}
Child() { super(0); } // 或 Child(int x) { super(x); }
Child() {
System.out.println("init"); // 編譯錯誤
super(0);
}
this(...) 避免重複初始化代碼。final,構造器一次性初始化,無 setter。構造器調用鏈是繼承初始化的骨幹。牢記「super 必須首行、父類無無參則子類必須顯式調用」、善用 this(...) 避免重複,能消除 90% 繼承初始化坑點。