Java子类未显式调用super()为何仍执行父类构造方法?
问题:子类构造器未显式调用
super()为何仍执行父类构造器? 代码示例
父类A
public class A { public A() { System.out.println("A"); } }
子类B
public class B extends A{ public B() { System.out.println("B"); } }
主方法
public static void main(String[] args){ B b1 = new B(); }
运行输出
A B
官方文档说明
构造器不是类成员,因此不会被子类继承,但子类可以调用父类的构造器。
我原本认为,除非在B类的构造器中显式调用super(),否则不应输出“A”。想知道为什么实际运行会输出“A”?
解答
这是Java的默认构造器调用规则导致的:
- 当子类构造器中没有显式调用
super()(父类构造器)或者this()(子类其他构造器)时,Java编译器会自动在子类构造器的第一行插入super(),也就是调用父类的无参构造器。 - 所以实例化B对象时,会先执行父类A的无参构造器(输出"A"),再执行子类B的构造器(输出"B")。
- 官方文档说构造器不被继承的结论没错——子类并没有继承父类的构造器,只是编译器自动帮你完成了父类构造器的调用动作,确保父类的初始化逻辑能被执行。
内容的提问来源于stack exchange,提问作者Dancchi
相关产品推荐
相关产品推荐

