静态块和实例变量的执行顺序

时间:2014-08-08 20:10:33

标签: java static

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的定义?

3 个答案:

答案 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