java中的类和接口初始化

ove*_*nge 4 java

下面是代码,

class Z{
    static int peekj(){
        return j;
    }
    static int peekk(){
        return k;
    }
    static int i = peekj();
    static int h = peekk();
    static final int j = 1;
    static int k = 1;
}


public class ClassAndInterfaceInitialization {
    public static void main(String[] args) {
        System.out.println(Z.i);
        System.out.println(Z.h);
    }
}
Run Code Online (Sandbox Code Playgroud)

遵循静态初始化的前向引用规则后,我将输出视为:

1
0
Run Code Online (Sandbox Code Playgroud)

之后class Z被加载及链接,在初始化阶段,可变 jfinal非常首先初始化1.变量k也用1.初始化.

但输出给出0变量k.

我怎么理解这个?

注意:编译器实际上替换j了前向引用规则后引用的变量值,而不像k

The*_*ind 6

static final intj一个编译时间常数.因此,它的值将作为字节码本身的一部分存在并传递.因此,j当你的类被初始化时,它将是1.但是k它是正确的static int,因此它的默认值将被打印,因为静态初始化程序在初始化值之前运行k.


saa*_*jha 5

k在初始化之前尝试访问,这就是为什么它是0.(h初始化为peekk()之前k定义,因此peekk()返回0,因为字段从上到下初始化.)j是最终的,所以它首先执行; 在声明之前i,因此i得到的值为j1.

这是适当的Oracle文档:

接下来,按文本顺序执行类的类变量初始值设定项和类的静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样.