为什么创建子类实例时即便不写super()也会自动调用父类构造方法
Java子类实例化自动调用父类无参构造的原因
class SuperDemo{ public static void main(String[] args) { B subClass = new B(); subClass.showbiz(); } } class A{ int i; A(){ i = 10; } } class B extends A{ void showbiz(){ System.out.println("i in subclass " + i); } }
核心原因
- Java编译器会在所有子类构造方法的第一行,隐式添加
super()语句,作用是调用父类的无参构造方法,该逻辑不需要开发者手动编写代码触发。 - 继承的底层逻辑要求,子类对象在初始化自有属性之前,必须先完成从父类继承的所有属性、方法的初始化工作,因此父类构造方法的执行优先级永远高于子类构造方法。
你给出的代码中,B类没有显式定义构造方法,编译器会自动为B类生成一个默认的无参空构造,这个空构造的第一行就默认存在隐式的super()调用,执行时会先触发父类A的无参构造给i赋值为10,再完成B类对象的初始化,因此调用subClass.showbiz()时可以正常输出i的值。
补充说明
如果父类没有定义无参构造,仅提供了带参构造,那么子类必须在构造方法第一行显式编写super(对应参数)调用父类的带参构造,否则编译器会报错,因为自动插入的super()找不到匹配的父类无参构造。
内容的提问来源于stack exchange,提问作者KrevoL
相关产品推荐
相关产品推荐

