静态初始化块的顺序

时间:2014-12-24 05:18:36

标签: java static

我在静态初始化块上发现了很多帖子,但是我试图更好地了解执行顺序及其原因。下面的代码打印出静态块中的文本和"然后"打印出主静态块中的文本。

我理解编译器调用它的方式是在加载类时按顺序执行所有静态块,然后访问main方法。但是由于main方法本身是静态的,为什么不按照其他静态块的顺序执行它(甚至不确定它是否有用,只是试图理解一个概念,以及是否有这样做的紧迫原因) 。如果我们想在主要块之后运行静态块怎么办?

class Cat {

    static
    {
        System.out.println("This block welcomes you first");
    }

    public static void main(String[] args)
    {
        System.out.println("Meow world ");
    }

    static
    {
        System.out.println("This block welcomes you after");
    }
}

实际输出

This block welcomes you first
This block welcomes you after
Meow world 

为什么不呢?

This block welcomes you first
Meow world 
This block welcomes you after

3 个答案:

答案 0 :(得分:8)

加载类后立即执行静态初始值设定项。在加载类之后,main方法称为

JLS的这一部分讨论了事件的顺序(12.1.3-4):

  

12.1.3。初始化测试:执行初始化程序

     

在我们的示例中,Java虚拟机仍在尝试执行类Test的方法main。只有在类已初始化(第12.4.1节)时才允许这样做。

     

初始化包括以文本顺序执行类Test的任何类变量初始值设定项和静态初始值设定项。但是在初始化Test之前,必须初始化其直接超类,以及直接超类它的直接超类的超类,依此类推,递归。在最简单的情况下,Test将Object作为其隐式直接超类;如果尚未初始化类Object,则必须在初始化Test之前初始化它。 Class Object没有超类,因此递归终止于此。


  

12.1.4。调用Test.main

     

最后,在完成类Test 的初始化之后(在此期间可能发生了其他相应的加载,链接和初始化),调用了Test的方法main。

答案 1 :(得分:6)

运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。别忘了,这个代码将在JVM加载类时执行。 JVM将所有这些块组合成一个静态块然后执行。以下是我想提到的几点:

If you have executable statements in the static block, JVM will automatically execute these statements when the class is loaded into JVM.
If you’re referring some static variables/methods from the static blocks, these statements will be executed after the class is loaded into JVM same as above i.e., now the static variables/methods referred and the static block both will be executed.

之后,main方法将执行。 感谢

答案 2 :(得分:2)

静态初始化程序在类初始化后立即执行(可以在以后的某个时间加载类并初始化。检查Class.forName())。 执行静态初始化程序后,main()方法称为。所以输出就是这样。