7

根据 java doc,静态块在类初始化时执行。

谁能告诉我为什么当我运行下面的代码时没有执行静态块?

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();
    }
}
4

2 回答 2

4

类的静态初始化通常在以下事件第一次发生之前立即发生:

  • 类的一个实例被创建,
  • 调用类的静态方法,
  • 分配了类的静态字段,
  • 使用非常量静态字段,或 [...]

您目前没有执行上述任何操作。所以,通过替换

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

以这个为例

A object = new A();

会给你你的结果。

于 2018-03-16T11:28:46.633 回答
2

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

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

类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:

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

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

分配了一个由 T 声明的静态字段。

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

于 2018-03-16T11:32:09.267 回答