super()必须是子类构造方法的第一条语句,因父类初始化须先于子类;未显式调用时编译器自动插入super(),若父类无无参构造则报错;this()与super()不可共存。

super() 必须是子类构造方法的第一条语句
Java 中,super() 调用父类构造方法时,编译器强制要求它必须出现在子类构造方法体的第一行。否则直接报错:call to super must be first statement in constructor。
这不是风格问题,是语法硬性限制——因为子类实例初始化前,父类部分必须先完成构建。
- 如果子类构造方法没显式写
super(...),编译器会自动插入无参的super() - 但父类没有无参构造方法时,这个隐式调用就会失败,必须手动写带参的
super(…) -
this(...)和super(...)不能共存于同一个构造方法中
super 访问父类成员时需注意作用域和重写状态
用 super.fieldName 或 super.methodName() 可以绕过子类的覆盖,直接访问父类中被隐藏或重写的成员。但它只在子类内部有效,且对 private 成员无效(父类私有成员根本不可见)。
- 访问字段:仅适用于被子类同名字段“隐藏”(hiding)的情况,不是重写;
super.name拿到的是父类字段值 - 调用方法:适用于被子类重写(overriding)的方法,
super.toString()会执行父类版本,而非当前对象的重写版 - 静态方法不能用
super调用——super.staticMethod()是非法语法,只能用ParentClass.staticMethod()
Python 的 super() 不是“调用父类”,而是“调用 MRO 链中的下一个类”
Python 的 super() 行为常被误解。它不固定指向直接父类,而是根据方法解析顺序(MRO)返回下一个参与继承链的类。多重继承下结果可能出人意料。
- 单继承时表现接近 Java:
super().__init__()等价于调用直接父类的__init__ - 多重继承时,必须所有父类都使用
super()配合一致的参数签名,否则 MRO 中途断链,某些父类构造方法不会被执行 -
super()在类方法、静态方法中行为不同;在普通方法中推荐写成super().method_name(),不要传入self - 调试可用
ClassName.__mro__查看实际顺序,比如Child.__mro__
常见错误:把 super 当作“父类 this”,忽略初始化顺序和可见性
最典型的误用是试图在子类字段初始化块或 final 字段赋值中调用 super.xxx,或者在父类构造方法还没完成时就让子类逻辑访问未初始化的父类状态。
- Java 中,父类构造方法未结束前,子类字段尚未分配内存,此时
super调用的方法若回调子类重写方法(如模板方法模式),可能导致NullPointerException或字段为默认值 - Python 中,在
__init__之前访问self属性会触发AttributeError,而super()并不能改变这个时机约束 - 跨语言共性:不要在
super()调用前使用子类特有资源(如打开文件、启动线程),因为父类构造失败会导致这些操作泄漏或状态不一致
super 往往是问题暴露的出口,而不是解法本身。

















