首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 靜態變數初始化與 main 方法執行順序解析

     編輯:程式設計疑難解答

核心結論

靜態變數初始化(含靜態區塊)優先於 main 方法執行。 類載入階段即完成靜態成員初始化,main 方法作為程式進入點在類初始化完成後才被 JVM 呼叫。

程式碼執行流程分析

public class ExplicitStaticEx {
    public static void main(String[] args) {
        print("Inside main()");
        Go.how();
        print("Go.s1: " + Go.s1);
    }
    static Go g1 = new Go(); // 靜態變數初始化
    static Go g2 = new Go(); // 靜態變數初始化
}

執行順序:

  1. JVM 載入 ExplicitStaticEx 類
  2. 執行靜態變數初始化與靜態區塊(按宣告順序):
    1. Go.s1 = "run"(靜態欄位)
    2. 靜態區塊:s2 = "drive car"; s3 = "fly plane"; print(...)
    3. static Go g1 = new Go() → 呼叫 Go() 建構子 → print("Go()")
    4. static Go g2 = new Go() → 呼叫 Go() 建構子 → print("Go()")
  3. 類初始化完成,JVM 呼叫 main() 方法
  4. main() 內執行:print("Inside main()") → Go.how() → print("Go.s1: " + Go.s1)

輸出結果

s2 & s3 initialized
Go()
Go()
Inside main()
run or drive car or fly plane
Go.s1: run

關鍵知識點

  • 類載入時機:首次主動使用類時(new、存取靜態欄位/方法、反射、main 類)觸發
  • 初始化順序:父類靜態 → 子類靜態 → 父類非靜態/建構子 → 子類非靜態/建構子
  • 靜態區塊 vs 靜態欄位:按程式碼出現順序依序執行
  • main 方法非初始化一部分:屬於類初始化完成後的執行階段

實務應用

單例模式、資源預載入、配置初始化等場景利用靜態初始化特性,確保在業務邏輯執行前完成準備工作。

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