public class InstanceInitialization {
private int i = assign();
private final int j = 5;
private int assign() {
return j;
}
public static void main(String[] args) {
System.out.println(new InstanceInitialization().i);
}
}
结果是5。
我知道类初始化,并且将根据JLS
首先初始化具有常量值的最终静态字段非常奇怪的是,在调用assign()方法之后,我发现该方法实际上将putfield放入j中。 这是反编译的说明:
private int i;
private final int j = 5 (java.lang.Integer);
public InstanceInitialization() { // <init> //()V
<localVar:index=0 , name=this , desc=Ljvm/classload/InstanceInitialization;, sig=null, start=L1, end=L2>
L1 {
aload0 // reference to self
invokespecial java/lang/Object <init>(()V);
}
L3 {
aload0 // reference to self
aload0 // reference to self
invokespecial jvm/classload/InstanceInitialization assign(()I);
putfield jvm/classload/InstanceInitialization.i:int
}
L4 {
aload0 // reference to self
iconst_5
putfield jvm/classload/InstanceInitialization.j:int
return
}
L2 {
}
}
private assign() { //()I
<localVar:index=0 , name=this , desc=Ljvm/classload/InstanceInitialization;, sig=null, start=L1, end=L2>
L1 {
iconst_5
ireturn
}
L2 {
}
}
从上面的代码中,对于具有constance值的最终实例字段,它似乎具有相同的行为,但是我无法从JLS中找到解释。