super调用被覆盖的父类方法是绕过多态强制执行父类版本,用于复用父类逻辑、支持扩展式重写并明确依赖父类契约,需满足非static、非private、在子类非静态方法内调用且参数匹配。

子类中用 super 调用被覆盖的父类方法,本质是“绕过多态,强制执行父类版本”。它不是在找“某个父类对象”,而是告诉 JVM:别走动态绑定,就调用当前类直接继承的那个父类里定义的这个方法。
为什么需要 super 调用被覆盖的方法
当子类重写了父类方法,this.方法名() 或直接写方法名,默认执行的是子类自己的版本。如果想复用父类逻辑(比如先校验、再处理),就必须显式指明调用父类实现:
- 避免重复写父类已有的通用逻辑
- 支持“扩展式重写”——先执行父类行为,再叠加子类特有操作
- 保持代码清晰:super 的出现,明确表达了“此处依赖父类契约”
super 调用被覆盖方法的前提条件
不是所有父类方法都能用 super 调用。必须同时满足:
- 方法是 实例方法(非 static)
- 方法是 可继承的(不能是 private)
- 调用位置在 子类的非静态方法体内部(不能在静态方法、静态块或字段初始化中)
- 参数列表与父类方法严格匹配(编译期检查重载解析)
super 和 this 在方法调用上的关键区别
同一个方法体内,两种写法效果完全不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- super.makeSound() → 固定调用父类定义的版本,不看运行时对象类型
- this.makeSound() 或 makeSound() → 触发动态绑定,最终执行哪个版本取决于实际对象类型(可能还是子类自己)
如果在子类重写方法里误写 this.makeSound(),容易造成无限递归;而 super.makeSound() 是安全、确定的父类入口。
典型使用模式:先父后子
最常见的写法是在重写方法开头调用 super,完成基础流程后再添加子类逻辑:
class Animal { void move() { System.out.println("Moving..."); } }class Bird extends Animal {
@Override
void move() {
super.move(); // 执行父类移动逻辑
System.out.println("Flying!"); // 再追加飞行动作
}
}

















