Object)向下到最深衍生類。
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. 複雜邏輯延遲到工廠方法或初始化方法執行