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)
    的求值(此时i仍为5)
  • 对象构造函数
  • 实例初始值设定项(将i从5增加到6的块)
  • 执行
    InstanceBlocks(int)
    构造函数的主体(由于第一步,参数的值为5,请注意,
    i=i*2
    正在修改参数,而不是字段)
  • 执行
    InstanceBlocks()构造函数体的其余部分
这在中有记录

实例初始值设定项只执行一次,因为只构造了一个实例

要回答您的具体问题:

“this”调用将值传递为5,但在“this”调用之前,i的值不是已经更改了吗


答案是“否,因为链式构造函数参数是在调用实例初始值设定项之前计算的”。

我不会重现您的输出。您究竟是如何调用InstanceBlocks的?它应该在第一个实例块6(而不是5)内用
新实例块()打印
。第一行不可能用该代码在第一个实例块5中显示
,“Inside def const”如果您指的是默认构造函数,那么它不是默认构造函数。这是一个零参数构造函数,但不是默认构造函数。基本上,撇开细节不谈,了解这个问题答案的最佳方法是使用调试器并观察代码运行。在
公共静态int i=5
上设置一个断点,然后从这里开始一步。这是一个完全有效的问题(顺便说一句,不是链接问题的重复)。这不是关于阴影!非常感谢你,乔恩·斯基特,现在说得很有道理。哇,乔恩,你真是个天才!特别感谢你的链接!