下面是代码,
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
被加载及链接,在初始化阶段,可变 j
感final
非常首先初始化1
.变量k
也用1
.初始化.
但输出给出0
变量k
.
我怎么理解这个?
注意:编译器实际上替换j
了前向引用规则后引用的变量值,而不像k
static final int
将j
一个编译时间常数.因此,它的值将作为字节码本身的一部分存在并传递.因此,j
当你的类被初始化时,它将是1.但是k
它是正确的static int
,因此它的默认值将被打印,因为静态初始化程序在初始化值之前运行k
.
归档时间: |
|
查看次数: |
406 次 |
最近记录: |