java中子类可用super调用被重写的父类实例方法,需满足可访问性且非static、non-private、non-final;不能用于private、static(仅隐藏)或final未重写方法。

在 Java 中,子类可以通过 super 关键字显式调用被重写(override)的父类方法,前提是该方法是 实例方法 且 可访问(如 public、protected,或包内默认访问权限且子类与父类在同一包中)。
语法很简单:super.方法名(参数)
只要父类中定义了该方法,子类中重写了它,就可以在子类方法体内用 super.methodName(...) 调用父类版本。这常用于在子类逻辑中“先执行父类行为,再扩展”。
- 必须在子类的非静态方法中使用(
super不能在static上下文中出现) - 不能用于调用被
private修饰的父类方法(子类根本不可见) - 不能用于调用被
final修饰但未被重写的方法(虽然可以调用,但不是“被覆盖后调用”的场景) - 如果父类方法是
static,super调用的是父类的静态方法,但这不属于“覆盖”(静态方法不参与多态,是隐藏 hide,不是重写 override)
典型使用场景:在重写方法中复用父类逻辑
比如父类定义通用校验,子类在此基础上增加额外检查:
class Animal {
void speak() {
System.out.println("Some sound");
}
}
<p>class Dog extends Animal {
@Override
void speak() {
super.speak(); // 先执行父类行为
System.out.println("Woof!"); // 再补充子类特有行为
}
}</p>
运行 new Dog().speak() 会输出两行,说明 super.speak() 确实调用了父类被覆盖的方法。
注意:super 不适用于构造方法以外的静态方法调用
虽然语法上允许写 super.staticMethod(),但编译器会警告并实际调用的是父类的静态方法(与变量绑定,而非运行时对象),这和“覆盖”无关。真正的覆盖只发生在实例方法上。
若误以为静态方法能被覆盖而用 super 调用,容易产生误解。记住:静态方法只有隐藏(hiding),没有覆盖(overriding)。
不能通过 super 调用父类私有方法
因为 private 方法对子类不可见,编译直接报错:
class Parent {
private void helper() { /* ... */ }
}
class Child extends Parent {
void doSomething() {
super.helper(); // 编译错误:cannot resolve symbol helper
}
}
此时只能通过父类提供的 protected 或 public 方法间接访问,或重构设计。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











