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

Java子类this()链式调用构造器时父类构造为何仅执行一次

Java构造器调用链规则说明

这个现象是Java构造器调用的硬性语法规则决定的,核心规则如下:

  • 所有构造方法的第一行逻辑二选一执行:要么通过this(参数列表)调用本类的其他构造方法,要么通过super(参数列表)调用父类的对应构造方法,二者不能共存,也不能都缺失。如果构造方法第一行既没写this(...)也没写super(...),编译器会自动插入无参的super()作为第一行代码。
  • 单个对象实例化的全流程中,父类的构造逻辑只会执行一次:父类构造的触发责任会沿着this(...)串联的本类构造链一直传递,直到找到链上第一个没有写this(...)的构造方法,由这个方法负责调用父类构造,不会在每个本类构造里重复调用父类构造。

对应示例的执行流程拆解

针对给出的测试代码,new House(" OK")的完整执行顺序是:

  1. 首先进入House(String name)构造,该构造第一行显式写了this()调用本类无参构造,因此编译器不会为它自动插入super(),这一步完全不会触发父类Building的构造。
  2. 进入本类无参构造House(),该构造没有显式写this(...)或super(...),编译器自动在第一行插入无参super(),在这里触发对父类Building无参构造的调用。
  3. 进入Building()无参构造,同样没有显式的this/super调用,自动插入对顶级父类Object无参构造的调用(空逻辑无输出),随后执行自身代码打印Buiding,执行完成后返回House()无参构造。
  4. 回到House()无参构造,执行自身代码打印House ,执行完成后返回House(String name)构造。
  5. 最后执行House(String name)中this()之后的代码,打印House: String Constructor OK,整个实例化流程结束。

常见误区提醒:不要误以为每个构造方法都会默认自带super()调用,只要构造方法里写了this(...),它就把调用父类构造的责任转交给了本类其他构造方法,不会自己触发父类初始化。毕竟一个对象实例化时,父类对应的成员状态只需要初始化一次,不可能重复执行多次父类构造。

内容的提问来源于stack exchange,提问作者Arya_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:24:29