javascript通过子类定义同名方法覆盖父类方法实现多态,无需特殊修饰符;可用super.方法名()调用父类实现;运行时根据对象实际类型动态绑定方法,体现“同一接口、不同行为”。

JavaScript 的 class 语法本身不提供像 Java 或 C++ 那样显式的“多态”和“方法重写”关键字,但它通过原型链、extends、super 和运行时动态绑定天然支持多态行为——关键在于子类**定义同名方法覆盖父类方法**,并用 super.方法名() 显式调用父类实现。
子类重写父类方法(方法重写)
在子类中定义与父类同名的方法,即完成重写。注意:不需要特殊修饰符(如 @Override),直接写同名方法即可。
示例:
class Animal {
speak() {
return "Some sound";
}
}
class Dog extends Animal {
speak() { // ✅ 重写了父类的 speak 方法
return "Woof!";
}
}
class Cat extends Animal {
speak() { // ✅ 另一种重写
return "Meow~";
}
}
const dog = new Dog();
const cat = new Cat();
console.log(dog.speak()); // "Woof!"
console.log(cat.speak()); // "Meow~"
console.log(new Animal().speak()); // "Some sound"
在重写方法中调用父类实现(用 super)
如果需要在子类方法中复用或扩展父类逻辑,用 super.方法名() 调用父类版本。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
super()只能在子类构造函数中调用,且必须在this使用前 -
super.xxx可在任意实例方法中调用父类属性或方法
示例:
class Animal {
constructor(name) {
this.name = name;
}
info() {
return `I'm ${this.name}`;
}
}
class Bird extends Animal {
constructor(name, canFly) {
super(name); // ✅ 必须先调用 super()
this.canFly = canFly;
}
info() {
const base = super.info(); // ✅ 复用父类逻辑
return `${base} and ${this.canFly ? 'can fly' : 'cannot fly'}`;
}
}
console.log(new Bird("Sparrow", true).info());
// → "I'm Sparrow and can fly"
多态的实际体现:同一接口,不同行为
JavaScript 的多态不依赖编译时类型检查,而靠**运行时对象的实际类型 + 方法存在性**决定调用哪个版本。只要对象有某个方法,就能被统一调用。
- 函数接受
Animal类型参数?JS 中没有类型约束,但可约定传入有speak()方法的对象 - 数组里混放
Dog、Cat、Bird实例,遍历调用.speak(),自动执行各自重写的版本
示例:
function makeAnimalsSpeak(animals) {
animals.forEach(animal => {
console.log(animal.speak()); // ✅ 自动调用对应实例上实际定义的 speak()
});
}
makeAnimalsSpeak([new Dog(), new Cat(), new Bird("Eagle", true)]);
// Woof!
// Meow~
// Some sound(Bird 没重写,就用 Animal 的)
注意事项和常见误区
- 重写只看方法名是否相同,不看参数个数或类型(JS 无重载概念)
- 箭头函数不能作为 class 方法(会丢失
this绑定),重写也必须用普通方法 - 静态方法也能被“重写”,但需用
super.方法名在子类静态方法中调用父类静态方法 - 没有
final或sealed机制阻止重写——JS 鼓励灵活覆盖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










