Java子类this()链式调用构造器时父类构造为何仅执行一次
Java构造器调用链规则说明
这个现象是Java构造器调用的硬性语法规则决定的,核心规则如下:
- 所有构造方法的第一行逻辑二选一执行:要么通过
this(参数列表)调用本类的其他构造方法,要么通过super(参数列表)调用父类的对应构造方法,二者不能共存,也不能都缺失。如果构造方法第一行既没写this(...)也没写super(...),编译器会自动插入无参的super()作为第一行代码。 - 单个对象实例化的全流程中,父类的构造逻辑只会执行一次:父类构造的触发责任会沿着
this(...)串联的本类构造链一直传递,直到找到链上第一个没有写this(...)的构造方法,由这个方法负责调用父类构造,不会在每个本类构造里重复调用父类构造。
对应示例的执行流程拆解
针对给出的测试代码,new House(" OK")的完整执行顺序是:
- 首先进入
House(String name)构造,该构造第一行显式写了this()调用本类无参构造,因此编译器不会为它自动插入super(),这一步完全不会触发父类Building的构造。 - 进入本类无参构造
House(),该构造没有显式写this(...)或super(...),编译器自动在第一行插入无参super(),在这里触发对父类Building无参构造的调用。 - 进入
Building()无参构造,同样没有显式的this/super调用,自动插入对顶级父类Object无参构造的调用(空逻辑无输出),随后执行自身代码打印Buiding,执行完成后返回House()无参构造。 - 回到
House()无参构造,执行自身代码打印House,执行完成后返回House(String name)构造。 - 最后执行
House(String name)中this()之后的代码,打印House: String Constructor OK,整个实例化流程结束。
常见误区提醒:不要误以为每个构造方法都会默认自带
super()调用,只要构造方法里写了this(...),它就把调用父类构造的责任转交给了本类其他构造方法,不会自己触发父类初始化。毕竟一个对象实例化时,父类对应的成员状态只需要初始化一次,不可能重复执行多次父类构造。
内容的提问来源于stack exchange,提问作者Arya_
相关产品推荐
相关产品推荐

