Java构造器调用疑问:为何第二构造器首行输出name不是Arnie?
问题解析:构造器中打印的name为何是"Bertie"而非"Arnie"
嘿,我明白你为啥困惑了——核心问题是你搞混了构造器的参数name和类的实例变量name,咱们一步步拆解new Machine("Bertie")的执行流程就清楚了:
执行步骤拆解
当你创建machine2时,调用的是Machine(String name)构造器,传入的参数是"Bertie",接下来的执行顺序是:
- 第一行
this("Arnie", 0);调用第三个构造器Machine(String name, int code):- 这里把实例变量
this.name赋值为"Arnie",this.code赋值为0 - 打印输出:
Third constructor running: Arnie 0
- 这里把实例变量
- 回到第二个构造器,执行第一个打印语句:
注意!这里的System.out.println("Second constructor running before 'this.name': " + name);name是构造器的参数变量(也就是你传入的"Bertie"),不是类里定义的私有实例变量this.name!这就是为啥你看到的是"Bertie"而不是预期的"Arnie"。 - 执行
this.name = name;:
这一步把实例变量this.name从之前的"Arnie"覆盖成参数的"Bertie" - 执行第二个打印语句:
这里的System.out.println("Second constructor running after 'this.name': " + name);name还是参数变量,但此时实例变量this.name也已经是"Bertie"了,所以输出和参数一致。
验证修改:如果要打印实例变量的初始值
如果你想在第二个构造器的第一个打印语句中输出实例变量的"Arnie",只需要明确指定this.name即可:
System.out.println("Second constructor running before 'this.name': " + this.name);
这样执行时就会打印出第三个构造器设置的"Arnie"了。
内容的提问来源于stack exchange,提问作者PeteC
相关产品推荐
相关产品推荐

