You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java构造器调用疑问:为何第二构造器首行输出name不是Arnie?

问题解析:构造器中打印的name为何是"Bertie"而非"Arnie"

嘿,我明白你为啥困惑了——核心问题是你搞混了构造器的参数name和类的实例变量name,咱们一步步拆解new Machine("Bertie")的执行流程就清楚了:

执行步骤拆解

当你创建machine2时,调用的是Machine(String name)构造器,传入的参数是"Bertie",接下来的执行顺序是:

  1. 第一行this("Arnie", 0);调用第三个构造器Machine(String name, int code):
    • 这里把实例变量this.name赋值为"Arnie",this.code赋值为0
    • 打印输出:Third constructor running: Arnie 0
  2. 回到第二个构造器,执行第一个打印语句:
    System.out.println("Second constructor running before 'this.name': " + name);
    
    注意!这里的name是构造器的参数变量(也就是你传入的"Bertie"),不是类里定义的私有实例变量this.name!这就是为啥你看到的是"Bertie"而不是预期的"Arnie"。
  3. 执行this.name = name;:
    这一步把实例变量this.name从之前的"Arnie"覆盖成参数的"Bertie"
  4. 执行第二个打印语句:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:55