静态类初始化何时发生?

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

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


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

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

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


    1 - JLS中的Java 6到Java 8都提供了最后的要点,但在规范中显然是错误的。 最终在Java 9 JLS中得到纠正:请参阅源代码。


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

    考虑一下这个例子:

    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未被初始化。


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

    链接地址: http://www.djcxy.com/p/13825.html

    上一篇: When does static class initialization happen?

    下一篇: Why doesn't Java allow overriding of static methods?