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

Java 構造器調用順序全解析:繼承鏈、成員初始化與多態陷阱

     編輯:Java 相關知識

標準調用順序

  1. 基類構造器:遞歸向上,從根基類(Object)向下到最深衍生類。
  2. 成員初始化:按聲明順序初始化實例字段(含隱式/顯式初始化)。
  3. 衍生類構造器主體:執行構造器內剩余代碼。

實例:Sandwich 多層繼承與組合

class Meal { Meal() { println("Meal()"); } }
class Lunch extends Meal { Lunch() { println("Lunch()"); } }
class PortableLunch extends Lunch { PortableLunch() { println("PortableLunch()"); } }
class Sandwich extends PortableLunch {
    Bread b = new Bread(); Cheese c = new Cheese(); Lettuce l = new Lettuce();
    Sandwich() { println("Sandwich()"); }
}
new Sandwich();

輸出驗證順序

Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()

完全符合:繼承鏈自上而下 → 成員按聲明序 → 衍生構造器主體。

為何必須先調用基類構造器?

  • 衍生類無法訪問基類 private 成員,只能由基類構造器初始化。
  • 進入衍生類構造器時,必須保證基類部分已完全構建完備,才能安全使用繼承來的成員。
  • 若不顯式調用 super(...),編譯器隱式插入 super()(無參構造器);若基類無無參構造器,編譯報錯。

陷阱預警:成員初始化前的多態調用

基類構造器中若調用被覆寫方法,會觸發衍生類方法,但此時衍生類成員尚未初始化(詳見上一節「構造器多態陷阱」)。此規則無法完全規避該風險,需開發者自律。

最佳實踐

構造器內:
1. 首行顯式 super(...)(如需參數)
2. 僅初始化本類字段
3. 避免調用任何非 final/private 方法
4. 複雜邏輯延遲到工廠方法或初始化方法執行

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved