首页 > 解决方案 > 如果超类没有构造函数而子类有构造函数本身不调用超类构造函数会发生什么

问题描述

假设有两个类A和B,B继承A。

现在我们还没有为 A 创建一个构造函数。

但另一方面,我们为 B 创建了一个构造函数,并没有调用 A 类的构造函数。

那么会发生什么,为什么

编辑:我创建这个问题主要是考虑java中的问题

标签: javainheritanceconstructordefaultsuper

解决方案


听起来您描述的代码是这样的:

class A {}

class B extends A {
  B() {}
}

语言规范中有两个部分与该问题相关。

首先,第 8.8.7 节说,如果构造函数主体不以this(...)or开头super(...),那么它隐含地以 开头super(),这是对超类的无参数构造函数的调用。

这意味着B实际上看起来像:

class B extends A {
  B() {
    super();
  }
}

(尝试比较有和没有显式super()调用的字节码,你会发现它们是相同的)

要编译它,A必须有一个无参数的构造函数。

虽然它显然没有构造函数,但语言规范的第二个相关位是第 8.8.9 节:当没有显式声明构造函数时,将隐式声明默认构造函数。这与类具有相同的访问修饰符,并且不带任何参数。

这意味着A实际上看起来像:

class A {
  A() {
    super(); // call to superclass constructor because of Sec 8.8.7, that is, Object().
  }
}

(再次尝试显式声明此构造函数并比较字节码)

这样的默认构造函数对于类调用超类构造函数是必需的,以便实例在使用前完全初始化。


推荐阅读