Java向上转型后方法调用疑问:为何执行子类moveForward?
Java多态与动态绑定问题解答
问题回顾
请考虑以下代码片段:
Vehicle aVehicle = new Auto(); aVehicle.moveForward(200);若Auto类继承自Vehicle类,且两个类均实现了moveForward方法,以下哪个陈述正确?
A) 将执行Auto类的moveForward方法。
B) 将执行Vehicle类的moveForward方法。
C) 必须在代码中指定使用哪个类的moveForward方法。
D) 无法确定调用哪个类的方法。
用户困惑:第一行代码执行了向上转型,aVehicle难道不应被视为Vehicle对象吗?为什么答案是A?
核心解释
- 这里的关键是Java的动态绑定机制:当用父类引用指向子类对象时,调用被重写的方法时,JVM会根据实际创建的对象类型(也就是
new Auto()生成的Auto实例)来决定执行哪个方法,而非引用的声明类型。 - 你提到的"aVehicle被视为Vehicle对象",指的是引用的编译时类型为Vehicle,但它指向的运行时对象类型是Auto。编译阶段仅会检查Vehicle类是否存在moveForward方法(保证语法合法),但运行阶段真正执行的是子类Auto中重写的方法版本。
- 因此选项A正确,会执行Auto类的moveForward方法。
内容的提问来源于stack exchange,提问作者YI Chen Wang
相关产品推荐
相关产品推荐

