When does static class initialization happen?

静态字段何时初始化?如果我从来没有实例化一个类,但是我访问了一个静态字段,是否所有的静态块和私有静态方法都用于实例化私有静态字段(按顺序) ?

如果我调用一个静态方法会怎样? 它是否也运行所有的静态块? 在方法之前?

77580 次浏览

是的,所有静态初始值设定项都在您第一次访问类之前运行。如果不是这样,我会称之为虫子。

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

想想这个例子:

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"
}
}

B 打印 null是因为当在静态范围中调用 sayHello时,没有初始化静态变量 a

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

  • an instance of the class is created,
  • 调用类的静态方法,
  • a static field of the class is assigned,
  • 使用非常量静态字段,或者
  • 对于顶级类,执行以词法嵌套在类中的断言语句 1

参见 JLS 12.4.1

也可以通过使用 Class.forName(fqn, true, classLoader)或短形式 Class.forName(fqn)强制类初始化(如果它还没有初始化)


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

See above.

静态字段何时初始化?

作为静态类初始化的一部分; 见上文。

If I never instantiate a class, but I access a static field, are ALL the static blocks and private static methods used to instantiate private static fields called (in order) at that instant?

是的。(没有什么是真正瞬间的。)

如果我调用一个静态方法会怎样? 它是否也运行所有的静态块? 在方法之前?

是的,是的。


请注意,可以构造可以观察静态字段的 default initialized值的代码。


1-最后一个要点出现在 JLS for Java6到 Java8中,但是它显然是规范中的一个错误。它最终在 Java9JLS 中得到了更正: 请参见 来源