public class H {
static final int x;
static {
x=2;
}
public static void main(String... args) {
System.out.print(new H().x);
}
}
这将打印 2 作为o / p。
现在我的问题是:
我们知道首先调用静态块。现在,如果调用静态块,我们在该块中有x=2
。那么编译器是如何工作的,因为在那之前我们没有x
的定义?
答案 0 :(得分:2)
静态变量在执行静态块之前初始化。 x
的定义值为0
,因为它是一个原语。然后为其分配值2
。
答案 1 :(得分:0)
加载类时执行<{1}}块。这在您的代码可以创建类的实例之前发生,因此在执行static
时,该值已经初始化。此外,您不应该使用实例引用引用静态成员。它应该是new H()
。
答案 2 :(得分:0)
编译器是如何工作的,因为直到那时我们还没有x的定义
x
被定义为H
class:
public class H{
//here is the definition of x static field
//is uninitialized but that's not a problem for the compiler
static final int x;
static {
//...
}
}
除此之外,类中的所有字段都使用默认值进行初始化。 int
字段初始化为0.这样可以在代码的任何部分使用H.x
并可编译。
关于执行,请检查@JimGarrison's answer。