super()必须是子类构造方法的第一条语句;Java中编译器自动插入无参super()仅当未显式调用构造器;Python依赖MRO;JS中super()必须在子类构造器中this前调用。

super() 必须是子类构造方法的第一条语句
Java 中,如果子类定义了构造方法且未显式调用 super() 或 this(),编译器会自动插入无参的 super()。但一旦你写了任意构造调用(比如 this(...)),编译器就不再帮你插 super(),此时若父类没有无参构造,就会报错:error: constructor XXX in class YYY cannot be applied to given types。
常见踩坑点:
- 父类只有带参构造,子类构造里又忘了写
super(...)→ 编译失败 - 写了
this(...)后,误以为还会自动调super()→ 实际不会,必须手动在this(...)调用的目标构造里补上super(...) -
super()只能出现在构造方法第一行,否则报错:error: call to super must be first statement in constructor
super 访问父类成员时不能用于 static 上下文
在实例方法或构造方法中,可以用 super.fieldName 或 super.methodName() 明确调用父类的非私有成员。但以下情况不合法:
- 在
static方法里写super.xxx→ 编译错误:error: non-static variable super cannot be referenced from a static context - 父类字段被子类同名字段遮蔽(shadowing),此时
super.fieldName是唯一安全访问父类原始字段的方式 - 父类方法被重写,
super.methodName()可绕过重写逻辑,直接执行父类版本 —— 这在模板方法、回调钩子等场景很关键
Python 中 super() 的行为与 Java 不同,需传参或依赖 MRO
Python 的 super() 不是“调父类”,而是按方法解析顺序(MRO)找下一个实现。在单继承中效果类似 Java,但多继承下容易出人意料。
- 在
__init__中漏掉super().__init__()→ 父类初始化逻辑完全跳过,可能引发AttributeError - Python 3 中可简写为
super(),但 Python 2 必须写super(ChildClass, self),否则报错 - 多个父类都调
super().__init__()时,必须保证所有父类构造方法签名兼容(例如都接受**kwargs),否则某个super()调用会因参数不匹配而崩溃
JavaScript 的 super 只在类构造器和方法中有效,且受限于 this 绑定
ES6 类中,子类构造函数必须在使用 this 前调用 super(),否则报错:ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor。
-
super()在构造器中必须调用,且只能调一次;调用后才能访问this - 在普通方法中用
super.methodName()是合法的,但不能在箭头函数或单独函数中使用 —— 因为super绑定的是当前方法的词法环境,不是运行时对象 - 如果父类构造器抛异常,子类构造器会立即终止,
super()调用本身就成了故障点,需在外层 try/catch
真正难的不是记住语法,而是理解每种语言里 super 背后的对象模型约束:Java 看类型继承链,Python 看 MRO 序列,JS 看原型链 + 构造器执行时机。写错往往不是拼写问题,而是没意识到当前上下文是否允许、是否已准备好、是否在正确的位置。

















