将更改的值传递给构造函数时,为什么不反映实例块更改

时间:2016-06-10 10:30:58

标签: java

我刚刚遇到了一个我从未尝试过的场景 -

public class InstanceBlocks {
    public static  int i = 5;

    {
        i ++;
        System.out.println("Inside first instance block "+ i);
    }

    public InstanceBlocks(){
        this(i);
        i++;
        System.out.println("Inside def const "+ i); 
    }

    public InstanceBlocks(int i){
        i =i*2;
        System.out.println("Inside param const "+ i);
    }

}

o / p是 -

Inside first instance block 6
Inside param const 10
Inside def const 7

为什么参数化构造函数打印10?这个'这个' call将值传递为5,但是在' this'之前我的值已经没有变化。调用

1 个答案:

答案 0 :(得分:2)

这里的执行顺序是:

  • 评估i this(i)内部(此时我仍然是5)
  • 对象构造函数
  • 实例初始值设定项(将i从5增加到6的块)
  • 执行InstanceBlocks(int)构造函数的主体(由于第一步,参数的值为5,并注意i = i * 2正在修改参数,而不是字段)
  • 执行InstanceBlocks()构造函数的其余部分

JLS 12.5中记录了这一点。

实例初始化程序只执行一次,因为只构造了一个实例。

回答您的具体问题:

  

' this' call将值传递为5,但是在' this'之前我的值已经没有变化。调用

答案是"不,因为链接的构造函数参数在调用实例初始化程序之前进行评估"。