在java中,子类可通过super.methodname()显式调用父类被重写的方法,用于扩展父类行为;仅限非静态方法中使用,要求父类方法非private、非final且具可访问性。

在 Java 中,子类可以通过 super 关键字调用父类中被重写(override)的方法。
使用 super.methodName() 显式调用父类方法
当子类重写了父类的某个实例方法,又需要在子类中执行父类的原始逻辑时,直接写 super.方法名() 即可。这是最常用、最明确的方式。
- 只能在子类的非静态方法中使用,不能在静态方法或静态上下文中调用
- 必须在有继承关系的前提下使用,且该方法在父类中可被访问(public/protected 或同包下默认访问权限)
- 如果父类方法是 private,子类实际无法重写它(只是定义了同名方法),此时
super调用会编译错误
常见适用场景
这类调用常用于:在子类方法中扩展父类行为,比如先执行父类逻辑,再添加子类特有处理。
- 构造器中调用父类构造器:
super(...)(必须是第一行) - 重写
toString()、equals()、hashCode()等通用方法时复用父类基础逻辑 - 模板方法模式中,子类在钩子方法里补充步骤,同时保留父类主流程
注意不能调用的情况
以下情况会导致编译失败或不符合预期:
- 父类方法是
private—— 子类根本没重写它,只是“隐藏”,super不可用 - 方法被
final修饰 —— 无法重写,自然也不存在“被重写后调用父类版本”的需求 - 静态方法被“隐藏”(不是重写)——
super.staticMethod()语法合法但不推荐,应直接用类名调用;且它不会体现多态性
简单示例
假设父类 Animal 和子类 Dog:
class Animal {
public void speak() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void speak() {
super.speak(); // 先调用父类逻辑
System.out.println("Dog barks: Woof!");
}
}
运行 new Dog().speak() 会输出两行,说明父类方法被成功调用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











