子类重写父类方法需用super调用父类同名方法(如需复用),保持签名一致、不破坏契约;明确意图:完全覆盖、前置/后置增强或条件调用;super必须在构造函数中this前调用,普通方法中可任意位置但注意顺序;禁止在箭头函数或错误上下文中使用super。

在子类中重写父类方法,核心是用 super 调用父类同名方法(如果需要复用逻辑),再添加或修改自己的行为;同时确保方法签名一致、不破坏原有契约。
明确重写的意图:覆盖、增强还是组合?
重写不是简单地“写个同名函数”,而是有目的的行为:
-
完全覆盖:子类提供全新实现,不调用父类方法(比如父类的
render()是 DOM 操作,子类改用 Canvas 实现) -
前置/后置增强:用
super.methodName(...)在开头或结尾执行父逻辑(比如日志记录、参数校验、清理工作) - 条件性调用:根据子类状态决定是否执行父逻辑(比如只在特定模式下才调用父类初始化)
正确使用 super 调用父类方法
super 必须在构造函数中 所有 this 引用之前 调用 super();在普通方法中,super.methodName() 可以出现在任意位置,但需注意执行顺序:
class Animal {
speak() {
console.log('Animal speaks');
}
}
class Dog extends Animal {
speak() {
console.log('Dog barks'); // 先执行子类逻辑
super.speak(); // 再委托父类(可选)
}
}
⚠️ 注意:super 不是对象,不能解构、赋值或单独引用;只能用于调用方法或访问属性(且该属性必须是原型上的可枚举方法)。
保持方法签名和返回值一致性
重写方法时,参数数量、类型预期(即使 JS 不强制)、返回值用途应尽量与父类一致,否则会破坏多态性:
- 父类方法接受两个参数,子类不要只接收一个并忽略第二个
- 父类返回布尔值表示成功与否,子类不应突然返回 Promise 或 null
- 若确实需要改变行为,应在文档中说明,并考虑用新方法名替代重写(更清晰)
避免常见错误
这些写法容易引发问题:
-
在箭头函数中用
super—— 箭头函数没有自己的this和super,会报错 -
在静态方法中误用实例版
super—— 静态方法要用super.staticMethod(),且仅限于继承自父类的静态方法 -
重写 getter/setter 时没调用
super却又依赖父类内部状态 —— 可能导致未定义行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











