如何通过初始化最终实例字段来解释此代码?

时间:2015-11-18 01:28:24

标签: java

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中找到解释。

0 个答案:

没有答案