Java初始化靜態變數的時間順序

鍋外的大佬發表於2020-11-19

1. 開始吧!

今天,我們來探討交流下靜態變數初始化過程。Java虛擬機器在類載入期間也同樣遵循這個過程。

2. 初始化過程

在較高的層次上,JVM執行以下步驟:

img

首先,載入並連結類。然後,這個過程的“初始化”階段處理靜態變數初始化。最後,呼叫與類關聯的main方法。
在接下來的討論中,我們來探索下類變數初始化。

3. 類變數

在Java中,靜態變數也稱為類變數。也就是說,它們屬於一個類,而不是一個特定的例項。因此,類初始化的時候也將初始化靜態變數
相反,類的例項 初始化的時候也將初始化 例項變數(非靜態變數)。類的所有例項共享該類的靜態變數。
StaticVariableDemo 類為例:

public class StaticVariableDemo {  
    public static int i;
    public static int j = 20;
 
    public StaticVariableDemo() {}
}

First, the JVM creates a Class object for the class StaticVariableDemo. Next, the static field initializers assign a meaningful default value to the static fields. In our example above, the class variable i is first initialized with an int default value of zero.

首先,JVM為 StaticVariableDemo 類建立一個Class物件。接下來,static 修飾的欄位將會被賦予一個有意義的預設值。在上面的例子中,類變數 i 首先使用用 int 的預設值0 來初始化
程式碼的書寫順序適用於靜態欄位初始化順序。首先,i將初始化,然後j將被初始化。完成初始化之後,類及其靜態成員將對其他類可見。

4. 靜態塊中的變數

再舉一個例子:

public class StaticVariableDemo {  
    public static int z;
 
    static {
        z = 30;
    }
    public StaticVariableDemo() {}
}

在這種情況下,變數初始化將按順序進行。首先,JVM最初將預設的int值0賦給變數z。然後,在static塊中,它被更改為30。

5. 靜態巢狀類中的變數

最後,讓我們以外部 StaticVariableDemo 類中的巢狀類為例:

public class StaticVariableDemo {  
    public StaticVariableDemo() {}
    
    static class Nested {
        public static String nestedClassStaticVariable = "test";
    }
}

在本例中,StaticVariableDemo 類載入 Nested 類。它將初始化靜態變數 nestedClassStaticVariable

6. 最後

在這篇短文中,我們簡要地解釋了靜態變數初始化。有關詳細資訊,請檢視 Java語言規範.

如果你覺得文章還不錯,記得關注公眾號: 鍋外的大佬
劉一手的部落格

相關文章