什么时候静态类初始化发生?

什么时候静态字段初始化? 如果我从来没有实例化一个类,但我访问一个静态字段,是所有的静态块和私人静态方法用于实例化私人静态字段调用(按顺序)在这个瞬间?

如果我调用静态方法呢? 它是否也运行所有的静态块? 之前的方法?

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

  • 该类的一个实例被创build,
  • 该类的静态方法被调用,
  • 该类的静态字段被分配,
  • 一个非恒定的静态字段被使用,或者
  • 对于顶级类,执行在词汇上嵌套的断言语句。

参见JLS 12.4.1 。

也可以通过使用Class.forName(fqn, true, classLoader)或简短的Class.forName(fqn)来强制类初始化(如果尚未初始化的话Class.forName(fqn)

静态字段在类加载(加载,链接和初始化)的初始化 “阶段”期间被初始化 ,其中包括静态初始化器和其静态字段的初始化。 静态初始化器按照类中定义的文本顺序执行。

考虑一下这个例子:

 public class Test { static String sayHello() { return a; } static String b = sayHello(); // a static method is called to assign value to b. // but its a has not been initialized yet. static String a = "hello"; static String c = sayHello(); // assignes "hello" to variable c public static void main(String[] arg) throws Throwable { System.out.println(Test.b); // prints null System.out.println(Test.sayHello()); // prints "hello" } } 

Test.b打印null因为当sayHello在静态作用域中调用时,静态variablesa未被初始化。

是的,所有静态初始值设定项都是在您第一次访问课程之前运行的。 如果是其他方式,我会把它称为一个错误。