在Java中,靜態變量的初始化分為兩個階段:加載和初始化。
加載階段:當類被加載到內存中時,靜態變量會被分配內存空間。此時,靜態變量會按照它們在代碼中出現的順序被初始化。需要注意的是,靜態變量的初始化順序與它們在代碼中的聲明順序相同。
初始化階段:在加載階段之后,靜態變量會按照它們在代碼中出現的順序進行初始化。初始化過程包括為靜態變量分配內存空間、為其賦初始值(如果有的話)以及執行靜態變量的初始化表達式(如果有的話)。
以下是一個簡單的示例,展示了靜態變量的初始化過程:
public class StaticVariableDemo {
static int a = 10; // 靜態變量a的初始化表達式為賦值操作
static {
System.out.println("靜態代碼塊1");
}
static int b = 20; // 靜態變量b的初始化表達式為賦值操作
static {
System.out.println("靜態代碼塊2");
}
public static void main(String[] args) {
System.out.println("主方法");
}
}
輸出結果:
靜態代碼塊1
靜態代碼塊2
主方法
在這個示例中,靜態變量a和b的初始化表達式分別為賦值操作。當類被加載時,首先初始化變量a,然后初始化變量b。在初始化過程中,會執行靜態代碼塊1和靜態代碼塊2。最后,執行主方法。
需要注意的是,靜態變量的初始化過程是線程安全的。JVM會確保在同一時刻只有一個線程可以初始化一個類。如果多個線程同時嘗試初始化同一個類,JVM會拋出一個java.lang.ClassInitializationException
異常。