在 java 继承中,子类调用被重写的父类方法需要使用 super 关键字。具体做法是在子类的方法体内使用 super.methodname() 来显式调用父类的实现,或者在子类的构造器中使用 super() 调用父类的构造器。这样做可以确保在子类扩展或修改行为的同时,保留父类的原有逻辑。

子类方法中如何调用父类被重写的方法
当子类重写了父类的方法时,直接调用该方法名会执行子类的版本。若需执行父类的原始逻辑,必须在子类方法内部使用 super 前缀。例如,在 ChildClass 的 display 方法中,通过 super.display() 可以触发 ParentClass 中的同名方法。这通常用于在子类增强功能(如添加日志或额外处理)后,再委托给父类完成核心工作。

class Parent {
void show() {
System.out.println("Parent show");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child before");
super.show(); // 调用父类被重写的方法
System.out.println("Child after");
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
c.show();
}
}运行上述代码将输出:
Child before
Parent show
Child after
立即学习“Java免费学习笔记(深入)”;
子类构造器中如何调用父类构造器
子类在实例化时,必须首先初始化父类部分。这通过在子类构造器的第一行使用 super(...) 来实现。如果子类构造器没有显式调用 super,编译器会默认插入无参的 super() 调用。若父类没有无参构造器,则子类必须显式定义带参的 super 调用,否则编译失败。这与方法重写不同,构造器不能被重写,只能被调用。

class Parent {
int val;
Parent(int v) {
this.val = v;
System.out.println("Parent init: " + val);
}
}
class Child extends Parent {
Child(int v) {
super(v); // 调用父类带参构造器
System.out.println("Child init");
}
}
public class Main {
public static void main(String[] args) {
new Child(10);
}
}运行上述代码将输出:
Parent init: 10
Child init
当父类方法为私有时子类能否调用
如果父类中被“看似重写”的方法实际上是 private 访问权限,子类无法直接通过 super 调用它。因为 private 成员仅在声明它的类内部可见,对子类不可见。此时,子类中定义的同名方法并不是真正的重写(Override),而是一个新的独立方法。因此,在子类中无法使用 super.privateMethod(),这会引发编译错误。若需访问父类私有状态,应通过父类提供的 protected 或 public 方法间接操作。


















