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

Java建構子初始化順序深度解析:繼承與物件建立的精確時序

     編輯:Java 程式設計入門

繼承鏈上的建構子呼叫規則

子類實例化時,必先執行父類建構子。若父類無無參建構子,子類必須顯式呼叫super(參數)且置於第一行。

案例1:預設建構子鏈

class SuperClass {
    SuperClass() { System.out.println("SuperClass constructor"); }
}
class SubClass extends SuperClass {
    SubClass() { System.out.println("SubClass constructor"); }
}
// 輸出:SuperClass constructor → SubClass constructor

案例2:帶參數父類建構子

class SuperClass {
    SuperClass(String s) { System.out.println("Super with string"); }
}
class SubClass extends SuperClass {
    SubClass(String s) { 
        // super(s); // 必須顯式呼叫,否則編譯失敗
        System.out.println("Sub with string"); 
    }
}

兩種修正方案差異:

  • 父類加無參建構子 → 僅輸出"Sub with string"
  • 子類呼叫super(str) → 輸出"Super with string" → "Sub with string"

物件初始化完整時序

建立物件時,執行順序嚴格遵循:

  1. 靜態成員變數/靜態區塊(類別載入階段,僅一次)
  2. 非靜態成員變數/實例初始化區塊(依宣告順序)
  3. 建構子本體

案例3:成員變數優先初始化

class One {
    One(String s) { System.out.println(s); }
}
class Two {
    One o1 = new One("one-1");
    One o2 = new One("one-2");
    Two(String s) { System.out.println(s); }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("main start");
        new Two("two");
    }
}
// 輸出:main start → one-1 → one-2 → two

案例4:靜態與非靜態交織

class Two {
    One o1 = new One("one-1");
    One o2 = new One("one-2");
    static One o3 = new One("one-3");  // 靜態優先
    Two(String s) { System.out.println(s); }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("main start");
        new Two("two-1");
        System.out.println("----");
        new Two("two-2");
    }
}
// 輸出:
// main start
// one-3          ← 類別載入時執行,僅一次
// one-1 → one-2 → two-1
// ----
// one-1 → one-2 → two-2  ← 靜態不再執行

實務建議

  • 父類保留無參建構子,或文檔強制要求子類呼叫特定super()
  • 避免在建構子中呼叫可被覆寫的方法(子類成員尚未初始化)
  • 靜態初始化避免依賴實例狀態
  • 複雜初始化考慮工廠方法或Builder模式替代建構子

精確掌握初始化時序,是編寫健壯Java類別、避免隱性Bug的關鍵基礎功夫。

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