我正在读一本关于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?它如何知道这种依赖?
答案 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?的回答。