子类重写父类方法后可通过 super.方法名() 显式调用父类被覆盖的方法;仅限非 private、非 static、非 final 的实例方法,适用于前置处理或后置清理等扩展逻辑。

在 Java 继承中,子类重写(override)父类方法后,仍可通过 super 关键字显式调用被覆盖的父类方法。
使用 super.方法名() 调用父类被覆盖的方法
这是最直接、最常用的方式。只要父类方法不是 private 或被子类声明为 final,子类中就可以用 super 访问它。
-
语法简单明确:在子类方法体内写
super.方法名(参数)即可调用父类版本 -
仅限非 private 方法:
private方法无法被继承,自然也不能用super调用 - 可在任意位置调用:可以在重写方法开头、中间或结尾调用,用于扩展逻辑(如前置处理、后置清理)
常见使用场景举例
比如父类定义了通用的日志打印逻辑,子类想保留并补充额外信息:
class Animal {
void speak() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void speak() {
super.speak(); // 先执行父类逻辑
System.out.println("Dog barks: Woof!"); // 再添加子类特有行为
}
}
运行 new Dog().speak() 会输出两行,说明父类被覆盖的方法已成功调用。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
注意不能调用的情况
以下情形会导致编译错误或无法调用:
- 父类方法是
private—— 子类根本看不到该方法,不构成重写,只是同名新方法 - 子类中将方法声明为
static,而父类是实例方法 —— 静态方法不参与多态,不存在“覆盖”,super也不能用于静态上下文 - 父类方法被
final修饰 —— 编译期禁止重写,自然也不会出现“被覆盖后还想调用”的需求
不推荐的替代方式
有人试图通过反射强行调用父类方法,例如 getSuperclass().getMethod(...).invoke(...),但这种方式:
- 破坏封装性和类型安全
- 性能差、代码可读性低
- 绕过访问控制(如对
protected方法还可能成功,但对包私有方法很可能失败) - 完全没有必要 ——
super就是为此设计的标准机制

















