繁体   English   中英

静态类初始化何时发生?

[英]When does static class initialization happen?

静态字段何时初始化? 如果我从不实例化一个类,而是访问一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法是否在那个瞬间被调用(按顺序)?

如果我调用静态方法怎么办? 它也运行所有静态块吗? 之前的方法?

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

  • 该类的实例已创建,
  • 该类的静态方法被调用,
  • 分配了该类的静态字段,
  • 使用了非恒定静态字段,或者
  • 对于顶级类,将执行词法嵌套在该类中的assert语句 1

参见JLS 12.4.1

也可以通过使用Class.forName(fqn, true, classLoader)或缩写形式Class.forName(fqn)来强制类进行初始化(如果尚未初始化)。


1-JLS for Java 6至Java 8中存在最后一个要点,但显然在规范中是错误的。 最终在Java 9 JLS中对其进行了纠正:请参见source

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

考虑示例:

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时,未初始化静态变量a

是的,所有静态初始化程序都将在您第一次访问类之前运行。 如果还有其他方法,我将其称为错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM