You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中子类重写方法后为何仍可通过super调用父类版本?

Java方法重写与super关键字的原理解答

为什么子类重写父类方法后,super.mostrarTipo()依然有效?

方法重写并不是“覆盖”或删除父类的方法,只是子类定义了一个与父类**同名、同参数列表、同返回值(协变返回除外)**的方法,让JVM在默认调用时优先使用子类版本。而super关键字的作用就是明确告诉JVM:跳过子类的方法,直接调用父类中定义的该方法。

内存中会保留两个版本的方法吗?

是的。Java中类的方法定义会存储在方法区的类元数据中:

  • 父类Vehiculo的mostrarTipo()方法始终存在于父类的元数据里;
  • 子类Motocicleta的重写方法则存储在子类的元数据中。
    当创建子类对象时,对象的方法表会包含父类未被重写的方法,以及子类重写后的方法,但父类的原始方法并没有被覆盖或删除,只是默认调用逻辑优先选择子类版本,super可以打破这个优先级。

方法重写的内部原理

Java采用**动态绑定(运行时绑定)**机制来处理方法调用:

  • 当你调用moto.mostrarTipo()时,JVM会先判断moto对象的实际类型是Motocicleta,所以先在Motocicleta的方法表中查找匹配的方法;
  • 找到子类重写的mostrarTipo()后执行该方法;
  • 当方法内部遇到super.mostrarTipo()时,JVM会直接去父类Vehiculo的方法表中查找对应的方法并执行,跳过子类的方法查找逻辑。

你的示例代码执行后,会依次输出:

Soy un vehículo
Soy una motocicleta

附示例代码:

class Vehiculo {
    public void mostrarTipo() {
        System.out.println("Soy un vehículo");
    }
}

class Motocicleta extends Vehiculo {
    @Override
    public void mostrarTipo() {
        super.mostrarTipo();
        System.out.println("Soy una motocicleta");
    }
}

// 执行代码
Motocicleta moto = new Motocicleta();
moto.mostrarTipo();

内容的提问来源于stack exchange,提问作者GersonDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:32:27