在Java中,类初始化阶段的执行顺序通常是按照以下规则进行的:
静态变量声明和静态代码块按照在类文件中的顺序依次执行。
静态变量声明(静态字段):按照在类文件中的顺序依次执行,给静态变量分配内存并初始化为默认值。
静态代码块:按照在类文件中的顺序依次执行。静态代码块中的代码会在类加载的连接阶段之后、初始化阶段之前执行。
静态方法在类初始化的后续阶段被调用。
静态方法的调用:静态方法可以在静态变量声明和静态代码块执行完毕后被调用。通常,静态方法是在类首次被主动使用时调用的,
例如在创建类的实例、访问静态字段、或者调用静态方法时。
示例:
考虑以下类的示例:
java
public class MyClass {
static {
System.out.println("Static block 1");
}
static int staticVariable = 10;
static {
System.out.println("Static block 2");
}
static void staticMethod() {
System.out.println("Static method");
}
public static void main(String[] args) {
System.out.println("Main method");
}
}
按照上述规则,类 MyClass 的初始化顺序是:
首先,加载类 MyClass 的字节码文件。
进行连接阶段,包括验证、准备(给静态变量分配内存并设置默认值)和解析(将符号引用解析为直接引用)。
执行静态变量的初始化和静态代码块:
staticVariable 被初始化为默认值(0),然后被赋值为 10。
第一个静态代码块输出 "Static block 1"。
第二个静态代码块输出 "Static block 2"。
最后,静态方法 staticMethod 可以在类被主动使用时调用。
总结:
静态变量和静态代码块按照它们在类文件中的顺序依次执行。
静态方法可以在静态变量和静态代码块初始化完成后被调用,通常是在类被主动使用时触发。
这些顺序和规则确保了类在加载和初始化时的正确性和可预测性。