Java 为什么将更改的值传递给构造函数时不反映实例块更改
我刚刚遇到了一个我以前从未尝试过的场景-Java 为什么将更改的值传递给构造函数时不反映实例块更改,java,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.
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?“this”调用将值传递为5,但在“this”调用之前i的值是否已更改?此处的执行顺序是:
- 对
内i
的求值(此时i仍为5)此(i)
- 对象构造函数
- 实例初始值设定项(将i从5增加到6的块)
- 执行
构造函数的主体(由于第一步,参数的值为5,请注意,InstanceBlocks(int)
正在修改参数,而不是字段)i=i*2
- 执行
InstanceBlocks()构造函数体的其余部分
答案是“否,因为链式构造函数参数是在调用实例初始值设定项之前计算的”。我不会重现您的输出。您究竟是如何调用InstanceBlocks的?它应该在第一个实例块6(而不是5)内用
新实例块()打印代码>。第一行不可能用该代码在第一个实例块5中显示,“Inside def const”如果您指的是默认构造函数,那么它不是默认构造函数。这是一个零参数构造函数,但不是默认构造函数。基本上,撇开细节不谈,了解这个问题答案的最佳方法是使用调试器并观察代码运行。在公共静态int i=5
上设置一个断点,然后从这里开始一步。这是一个完全有效的问题(顺便说一句,不是链接问题的重复)。这不是关于阴影!非常感谢你,乔恩·斯基特,现在说得很有道理。哇,乔恩,你真是个天才!特别感谢你的链接!