我刚刚遇到了一个我从未尝试过的场景 -
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'之前我的值已经没有变化。调用
答案 0 :(得分:2)
这里的执行顺序是:
i
this(i)
内部(此时我仍然是5)InstanceBlocks(int)
构造函数的主体(由于第一步,参数的值为5,并注意i = i * 2
正在修改参数,而不是字段)InstanceBlocks()
构造函数的其余部分JLS 12.5中记录了这一点。
实例初始化程序只执行一次,因为只构造了一个实例。
回答您的具体问题:
' this' call将值传递为5,但是在' this'之前我的值已经没有变化。调用
答案是"不,因为链接的构造函数参数在调用实例初始化程序之前进行评估"。