首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 構造器鏈與繼承規則全解析

     編輯:Java 相關知識

核心規則:子類構造器必須調用父類構造器

創建子類實例前,必須先完成父類部分的初始化。Java 強制要求子類構造器的第一條語句顯式或隱式調用父類構造器。

情況一:雙方均無顯式構造器(隱式默認構造器)

class Base {}
class Derived extends Base {
    public static void main(String[] args) {
        new Derived(); // 編譯器自動插入 super(),調用 Base(),正常運行
    }
}

情況二:父類有帶參構造器,子類無參構造器未顯式調用 super(...)

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) 傳遞子類構造器參數。

關鍵結論

  1. 父類無構造器 → 編譯器生成 Base(),子類隱式 super() 正常
  2. 父類有構造器但無無參構造器 → 子類必須在每個構造器首行顯式 super(...) 調用現有父類構造器
  3. 父類有無參構造器(顯式或隱式) → 子類無參構造器可隱式 super(),帶參構造器仍需顯式 super(...) 若不想用無參版
  4. this(...) 調用本類其他構造器,最終仍會鏈式到達某個 super(...)

最佳實踐

  • 父類始終提供無參構造器(即使為 protected),降低子類編寫負擔
  • 不可變類採用構造器注入所有最終字段,避免 setter 破壞不可變性
  • 構造器中避免調用可覆寫方法,防止子類字段未初始化時被父類構造器間接使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved