为什么静态块没有执行

8
根据Java文档,静态代码块会在类初始化时执行。
请问有人可以告诉我为什么下面的代码运行时静态代码块没有被执行吗?
class A {
    static {
        System.out.println("Static Block");
    }
}

public class Main {

    public static void example1() {
        Class<?> class1 = A.class;
        System.out.println(class1);
    }


    public static void example2() {
        try {
            Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A");
            System.out.println(class1);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        example1();
    }
}
2个回答

5
一个类的静态初始化通常发生在以下事件之一发生之前:
创建该类的实例时,
调用该类的静态方法时,
分配该类的静态字段时,
使用非常量静态字段时,或者[...]
您目前没有执行上述任何操作。因此,通过替换

Class<?> class1 = A.class;
System.out.println(class1);

例如,使用这个。
A object = new A();

将为您提供结果。

当我执行这行代码 "Class<?> class1 = A.class;" 时会发生什么呢?JVM不会加载A类吗? - Sridhar Srinivasan
如果您执行此行,则 JVM 将加载该类,但不会将其初始化,因为类初始化是根据一组规则进行的(请参见我的上述引用),而这些规则中未包括此操作。 - arxakoulini

2
引用A.class不会执行A的静态初始化程序,请参见此处

并且

类的初始化包括执行其静态初始化程序和在类中声明的静态字段(类变量)的初始化程序。

当满足以下任一条件之一时,将立即初始化类或接口类型T:

T是一个类,并且创建了T的实例。

调用了由T声明的静态方法。

对T声明的静态字段进行了赋值。

使用了T声明的静态字段,并且该字段不是常量变量(§4.12.4)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接