super调用父类被覆盖的方法是在子类中显式调用父类同名方法以复用其逻辑,必须在非静态方法内使用,参数需匹配,不能用于private或static方法,且super绑定父类实现而非运行时类型。

子类用 super 调用父类被覆盖的方法,就是在子类方法内部通过 super.方法名() 显式调用父类中同名但已被重写(override)的方法。这是 Java 中实现“在子类中复用父类逻辑”的核心方式。
super 调用被覆盖方法的基本语法
当子类重写了父类的实例方法(非 private、非 static),就可以在子类方法体中用 super.方法名(...) 来调用父类版本:
- 必须在子类的非静态方法内使用
- 不能在静态上下文(如静态方法、静态代码块)中使用
super - 参数列表需与父类方法匹配,编译器会检查重载解析
- 若父类方法是
private,则子类根本不可见,也无法用super调用
典型使用场景:在重写方法中扩展父类行为
常见于“先执行父类逻辑,再添加子类特有处理”:
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
super.makeSound(); // 先调用父类逻辑
System.out.println("Dog barks: Woof!"); // 再追加子类逻辑
}
}
调用 new Dog().makeSound() 会输出两行,说明父类方法确实被执行了。
注意区分 super 和 this 的调用目标
super.方法名() 总是绑定到父类的实现,而 this.方法名()(或直接写方法名)触发的是当前对象的**运行时类型**所决定的最终版本(即可能仍是子类自己的重写方法):
- 如果在子类方法里写
this.makeSound(),且该方法被重写,就会再次进入子类的makeSound,可能导致无限递归 -
super.makeSound()则绕过动态绑定,强制调用父类定义的那个版本
不能用 super 调用的情况
以下情形无法通过 super 访问父类被覆盖的方法:
- 父类方法为
private:子类不继承 private 方法,super 不可见 - 父类方法为
static:static 方法不参与重写,super.staticMethod()只是语法糖,实际调用的是父类的静态方法,和多态无关 - 构造器中调用:super() 必须是第一句,且只能调用父类构造器,不能调用普通成员方法
- 子类未重写该方法:此时直接调用就是父类版本,不需要 super(但加 super 也合法,效果相同)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











