java - 如果超类没有构造函数而子类有构造函数本身不调用超类构造函数会发生什么
问题描述
假设有两个类A和B,B继承A。
现在我们还没有为 A 创建一个构造函数。
但另一方面,我们为 B 创建了一个构造函数,并没有调用 A 类的构造函数。
那么会发生什么,为什么?
编辑:我创建这个问题主要是考虑java中的问题
解决方案
听起来您描述的代码是这样的:
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().
}
}
(再次尝试显式声明此构造函数并比较字节码)
这样的默认构造函数对于类调用其超类构造函数是必需的,以便实例在使用前完全初始化。
推荐阅读
- python-2.7 - 来自网页的python 2.7绝对链接
- r - 用于在 R 中搜索数据框的正则表达式
- ajax - 对 webapi 的 Ajax 调用未命中 ajax 响应且未返回结果
- python - 没有回复原始套接字python的ARP请求
- ios - UITableViewCell 中的 UIStackView 中的 UICollectionview
- javascript - 如何为 vim 命令执行 tern?
- neo4j - 如何将查询中的所有节点精确匹配到另一个
- c# - 通过 C# 添加 SQL 参数不起作用,但在存储过程中进行硬编码可以吗?
- angular - 将页面选择设置为 PrimeNG p-table 的最后一页
- css - SCSS 映射值内的逗号(框阴影)