核心規則
- 子類不繼承父類建構子
- 子類建構子首行必須呼叫父類建構子(
super(...))或同類其他建構子(this(...))
- 若父類只有帶參建構子,子類必須顯式呼叫
super(參數)
- 若父類有無參建構子,子類可省略
super(),編譯器自動插入
程式碼示範
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;
SubClass() { /* 隱式 super() */ System.out.println("SubClass()"); }
SubClass(int n) { super(300); System.out.println("SubClass(int n):" + n); this.n = n; }
}
執行順序驗證
new SubClass(200);
// 輸出:
// SuperClass(int n):300
// SubClass(int n):200
常見錯誤
- 忘記父類無無參建構子時呼叫
super() → 編譯錯誤
- 在建構子中呼叫可被重寫的方法 → 子類欄位尚未初始化,導致 NPE 或邏輯錯誤
- 誤以為
super() 可寫在非首行 → 編譯錯誤
設計建議
- 父類保留無參建構子或提供明確的建構子鏈
- 建構子避免複雜邏輯,僅做欄位初始化
- 不可變物件採用 Builder 模式替代多參建構子