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

Java 類初始化順序深度解析:靜態/實例變量與代碼塊執行機制

     編輯:Java 綜合教學

Java 類初始化順序深度解析:靜態/實例變量與代碼塊執行機制

理解 Java 類的初始化順序對於排查繼承體系中的難以預期行為至關重要。本文透過一個父子類繼承的完整案例,詳細闡述靜態變量、靜態代碼塊、實例變量、實例代碼塊與建構子的執行時序。

測試類別結構

1. 輔助類 Foo

public class Foo {
    public Foo(String word) {
        System.out.println(word);
    }
}

2. 父類 Parent

public class Parent {
    static Foo FOO = new Foo("Parent's static parameter");
    Foo foo = new Foo("Parent's parameter");

    static {
        System.out.println("Parent's static code block");
    }

    {
        System.out.println("Parent's code block");
    }

    public Parent() {
        System.out.println("Parent.Parent()");
    }
}

3. 子類 Child

public class Child extends Parent {
    static Foo FOO = new Foo("Child's static parameter");
    Foo foo = new Foo("Child's parameter");

    static {
        System.out.println("Child's static code block");
    }

    {
        System.out.println("Child's code block");
    }

    public Child() {
        System.out.println("Child.Child()");
    }
}

4. 執行入口

public class Run {
    public static void main(String[] args) {
        new Child();
    }
}

執行結果

Parent's static parameter
Parent's static code block
Child's static parameter
Child's static code block
Parent's parameter
Parent's code block
Parent.Parent()
Child's parameter
Child's code block
Child.Child()

詳細執行步驟解析

  1. 父類靜態成員初始化:按源碼順序依次執行靜態變量賦值與靜態代碼塊。
    • 執行 static Foo FOO = new Foo(...) → 輸出 "Parent's static parameter"
    • 執行 static { ... } → 輸出 "Parent's static code block"
  2. 子類靜態成員初始化:同樣按源碼順序執行。
    • 執行 static Foo FOO = new Foo(...) → 輸出 "Child's static parameter"
    • 執行 static { ... } → 輸出 "Child's static code block"
  3. 父類實例成員初始化:在調用父類建構子前執行。
    • 執行 Foo foo = new Foo(...) → 輸出 "Parent's parameter"
    • 執行 { ... } (實例代碼塊) → 輸出 "Parent's code block"
  4. 父類建構子執行:輸出 "Parent.Parent()"。
  5. 子類實例成員初始化:在調用子類建構子前執行。
    • 執行 Foo foo = new Foo(...) → 輸出 "Child's parameter"
    • 執行 { ... } → 輸出 "Child's code block"
  6. 子類建構子執行:輸出 "Child.Child()"。

核心規則總結

  • 靜態優於實例:類加載階段完成所有靜態初始化;實例化階段才處理實例成員。
  • 父類優於子類:無論靜態還是實例,父類總在子類之前完成初始化。
  • 源碼順序即執行順序:同一類別中,靜態變量/塊與實例變量/塊均按聲明順序依次執行。
  • 前向引用限制:靜態代碼塊可使用前面聲明的靜態變量,但不能使用後面聲明的;實例代碼塊同理。

記憶口訣

一、父類靜態變量、靜態代碼塊(按順序)
二、子類靜態變量、靜態代碼塊(按順序)
三、父類實例變量、實例代碼塊(按順序)
四、父類建構子
五、子類實例變量、實例代碼塊(按順序)
六、子類建構子
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved