【发布时间】:2013-10-04 19:27:44
【问题描述】:
根据我对动态绑定的了解,JVM 在运行时会查看对象的实际类型并在该类中搜索实现,然后向上遍历继承级别。
例如,如果我们有:Vehicle v = new Car();
假设类Car扩展Vehicle,我们可以看到引用变量类型是Vehicle,对象类型是Car。
如果我们说:v.start():
JVM 将首先在 Car 类中查找 start 方法实现,然后在 Vehicle 类中查找。
以下代码中有一个示例:
public class scratch{
public static void main(String [] args){
Vehicle v = new Car();
v.start();
}
}
class Vehicle{
public void start(){
System.out.println("Vehicle class");
}
}
class Car extends Vehicle{
public void start(){
System.out.println("Car class");
}
}
此代码的输出,正如预期的那样:“Car class”
这是我的问题:如果我从 Vehicle 类中取出 start 方法,完全擦除它,程序将不再运行。根据我对动态绑定的了解,JVM 仍应查看对象的实际类型(在本例中为 Car),并仍运行 start 方法的 car 实现。但是,它不这样做。
为什么?
【问题讨论】:
-
因为该方法不存在。你会得到一个NoSuchMethodError
-
恕我直言,如果您删除
start函数并执行Vehicle v = new Car()这将是编译器错误。由于编译器会检查 LHS 对象以验证调用的函数是否存在于其中。 -
@VusP 这取决于他修改了 .class 还是 .java。但是,是的,更有可能出现编译错误。
-
@tieTYT 也许我误解了“如果我从 Vehicle 类中取出 start 方法,请完全删除它”。他这是什么意思?
-
@VusP 我认为这是模棱两可的。我们都以不同的方式解释它:)但这并不妨碍我们回答这个问题。
标签: java inheritance dynamic binding