声明/调用静态变量和方法的顺序

Joo*_*oop -1 java static runtime

我正在读一本关于Java的书.它给出了一个这样的例子:

class UseStatic {
    static int a = 3;
    static int b;

    // ... some more lines  

    static {
        b = 4 * a;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后它解释了这个:

一旦UseStatic类被加载,所有的static 语句运行.首先,a设置为3,然后静态块执行,...,然后初始化ba*4或12.

我想知道这里的线路是如何实现的.它如何能第一,从顶部开始的static int a = 3以才跳过static int bstatic {..},只再跳回静态INT B' 它如何知道这种依赖?

Mat*_*all 7

它没有"跳过static int b",也没有"跳回去static int b".没有什么可以"跳回" ,因为static int b它只是一个声明,而不是初始化/分配.它声明变量但不为其赋值.

首先a声明并初始化.然后b宣布.然后static执行块,为其分配值b.

Java语言规范规定了所有这些事情的确切顺序.请参阅Jon Skeet的回答在JLS中是否有关于执行静态初始化块的顺序的保证?更多.