1. 開始吧!
今天,我們來探討交流下靜態變數初始化過程。Java虛擬機器在類載入期間也同樣遵循這個過程。
2. 初始化過程
在較高的層次上,JVM執行以下步驟:
首先,載入並連結類。然後,這個過程的“初始化”階段處理靜態變數初始化。最後,呼叫與類關聯的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語言規範.
如果你覺得文章還不錯,記得關注公眾號: 鍋外的大佬
劉一手的部落格