什么时候必须显式调用super()构造函数?相关说法及规则解读
引用表述的具体含义
由于继承而来的实例变量需要初始化,而基类构造函数就是为此设计的,因此应当始终显式调用
super()。
这段表述是面向对象继承场景下的通用最佳实践,核心逻辑如下:
- 子类实例会完整继承基类的所有实例属性,其中基类的私有属性只能由基类自己的构造函数完成合法初始化,子类无权也不需要重复实现这部分逻辑,调用
super()就是触发基类构造的唯一标准途径 - 即使所用编程语言支持隐式调用无参
super(),显式写出也能让代码逻辑更直观,后续维护者可以直接看出子类初始化对基类的依赖关系 - 可以规避后续基类迭代删除无参构造函数时,子类代码批量报错的问题,显式调用的适配成本远低于隐式调用
必须显式调用super()的其他场景
除了基类未定义无参构造、隐式调用会报错的情况外,以下场景也必须显式调用:
- 基类仅提供带参构造函数时:编程语言默认的隐式
super()只会调用无参构造,此时必须显式传入对应参数,匹配基类的带参构造签名才能完成初始化 - 子类构造逻辑依赖基类初始化结果时:比如基类构造会完成配置读取、资源连接、状态校验等前置操作,子类构造的逻辑要用到这些前置结果,必须显式调用
super()保证执行顺序 - 需要指定调用基类多个构造中的某一个时:如果基类重载了多个不同参数的构造函数,你不想用默认无参构造,就必须显式传参调用对应版本的
super() - 部分编程语言要求在子类构造中访问
this实例前必须完成基类初始化:比如Java、Kotlin中,如果要在子类构造函数的最开头操作实例属性、调用实例方法,必须先显式写super()完成基类初始化,否则会直接编译报错
内容的提问来源于stack exchange,提问作者Saira
相关产品推荐
相关产品推荐

