为什么不执行静态块

时间:2018-03-16 08:55:10

标签: java static-block classloading

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

2 个答案:

答案 0 :(得分:2)

引用A.class不会导致执行A的静态初始值设定项,请参阅here

  

类的初始化包括执行其静态   初始化器和静态字段的初始化器(类变量)   在课堂上宣布。

并且

  

类或接口类型T将在紧接之前初始化   首次出现以下任何一种情况:

     

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

     

调用T声明的静态方法。

     

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

     

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

答案 1 :(得分:1)

  

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

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

您目前没有做以上任何一项。 所以,通过替换

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

以此为例

A object = new A();

会给你你的结果。