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

Java 類初始化順序深度解析:靜態塊、實例塊、構造器誰先誰後?

     編輯:Java 相關知識

Java 類初始化順序是面試高頻考點,亦是理解物件創建機制的基石。本文通過雙類繼承的完整代碼示例,逐步拆解父子類靜態變數、靜態塊、實例變數、實例塊、構造器的精確執行順序,並驗證多次實例化的差異。

測試代碼結構

class A {
    static { print("A1"); }
    static int num = getNum();  // 靜態變數賦值
    { print("A3"); }            // 實例塊
    String context = test();    // 實例變數賦值
    A() { print("A2"); }        // 構造器
}
class B extends A {
    static { print("a"); }
    { print("c"); }
    B() { print("b"); }
    // 覆寫 test()、getNum()
}
new B(); new B();

執行結果與解析

第一次 new B():

  1. 父類靜態:A.getNum() → A1
  2. 子類靜態:a
  3. 父類實例變數/塊:B.test()(多態調用子類覆寫方法)→ A3
  4. 父類構造器:A2
  5. 子類實例塊:c
  6. 子類構造器:b

輸出:A.getNum(),A1,a,B.test(),A3,A2,c,b,

第二次 new B():

靜態初始化已完成,直接從父類實例變數/塊開始:B.test(),A3,A2,c,b,

核心口訣

  1. 靜態變數/塊:父→子,僅類載入時執行一次
  2. 實例變數/塊:父→子,每次 new 都執行
  3. 構造器:父→子,每次 new 都執行
  4. 多態生效:父類初始化階段調用被覆寫方法,執行子類邏輯(注意:此時子類實例尚未完全初始化)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved