Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

创建子类时为什么先执行父类构造器?一定调用无参的吗?

查看完整题解

参考回答

直接回答

先纠正题目前提:并非一定调用父类无参构造器。子类构造器可以显式 super(参数),也可以先 this 委托;若没有显式委托,普通类通常隐含 super()。父类实例部分需要先完成初始化,子类才能在相应基础上继续建立自己的状态。

讲清原理

一个子类实例中包含父类定义的实例状态,但这不意味着额外创建了一个独立父类对象。对象的字段先有默认值,随后构造链按规则逐层完成各层初始化。

若父类没有可访问的无参构造器,子类不能依赖隐含 super(),需要显式选择合适的父构造器。Java 21 的调用位置仍须遵守首条语句限制。

构造器逐层委托,父类实例部分先完成,再执行子类初始化与构造器体
构造器逐层委托,父类实例部分先完成,再执行子类初始化与构造器体

例子与易错点

class Parent {
    { System.out.println("父初始化"); }
    Parent() { System.out.println("父构造体"); }
}
class Child extends Parent {
    { System.out.println("子初始化"); }
    Child() { System.out.println("子构造体"); }
}
new Child();
// 父初始化、父构造体、子初始化、子构造体

静态初始化属于类初始化,不能混进每次创建实例都会重复执行的步骤。父构造器调用可重写方法时,子类字段还可能是默认值,因此“父类先构造”也不能保证所有回调都已安全。

相关题:第 7 题、第 29 题、第 38 题、第 42 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。