在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
异常。