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