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

Java 静态块和实例变量的执行顺序,java,static,Java,Static,这将以o/p的形式打印2 现在我的问题是: 我们知道静态块首先被称为静态块。现在,如果调用静态块,则该块中有x=2。那么编译器是如何工作的,因为直到那时我们还没有定义x?静态变量是在执行静态块之前初始化的x是用值0定义的,因为它是一个原语。然后将2的值分配给它,加载类时执行静态块。这发生在代码创建类实例之前,因此在执行newh()时,值已经初始化。此外,不应使用实例引用引用静态成员。它应该是H.x 编译器是如何工作的,因为直到那时我们还没有x的定义 x定义为H类的静态字段: public cla

这将以o/p的形式打印2

现在我的问题是:


我们知道静态块首先被称为静态块。现在,如果调用静态块,则该块中有
x=2
。那么编译器是如何工作的,因为直到那时我们还没有定义
x

静态变量是在执行静态块之前初始化的
x
是用值
0
定义的,因为它是一个原语。然后将
2
的值分配给它,加载类时执行
静态
块。这发生在代码创建类实例之前,因此在执行
newh()
时,值已经初始化。此外,不应使用实例引用引用静态成员。它应该是
H.x

编译器是如何工作的,因为直到那时我们还没有x的定义

x
定义为
H
类的静态字段:

public class H {
    static final int x;
    static {
        x=2;
    }
    public static void main(String... args) {
        System.out.print(new H().x);
    }
}
除此之外,类中的所有字段都使用默认值初始化<代码>整数字段初始化为0。这样就可以在代码的任何部分使用
H.x
,并且可以编译


关于执行,请检查。

注意,您可以执行
System.out.print(H.x)
并得到相同的结果。当您在静态值或方法上使用实例引用时,javac编译器会伪造静态引用。当然,即使
x
不是静态的,而是在构造函数中初始化的,您也会得到相同的结果。如果
x
是静态的,那么执行
H nullH=null;系统输出打印(nullH.x)
@HotLicks您所说的javac编译器伪造静态引用是什么意思?为什么nullH.x可以工作?如果您使用引用而不是类来引用静态引用,当javac故意伪造东西时,我不确定是否可以说“不应该”。
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 {
        //...
    }
}