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
相关产品推荐
相关产品推荐

