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

时间:2014-11-15 19:26:12

标签: java static runtime

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

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

    // ... some more lines  

    static {
        b = 4 * a;
    }
}

然后它解释了这个:

  

加载UseStatic类后,static全部a   语句运行。首先,3设置为b,然后设置为静态块   执行,...,然后将a*4初始化为static int a = 3或12。

我想知道这里有什么线路被排除的顺序。它如何首先从static int b的顶部开始,然后才跳过static {..}到{{1}},然后才跳回到静态int b?它如何知道这种依赖?

1 个答案:

答案 0 :(得分:7)

它没有跳过static int b",而且它没有跳回static int b。"什么都没有“跳回来”#34; to 因为static int b只是一个声明,而不是初始化/分配。它声明了变量,但没有给它赋值。

声明并初始化第一个a。然后声明b。然后执行static块,将值赋给b

Java语言规范规定了所有这些事情的确切顺序。有关详情,请参阅Jon Skeet对Are there any guarantees in JLS about order of execution static initialization blocks?的回答。