考虑以下基本/派生类:从Java子类中调用的方法不是在父类
public class Car {
private int cylinders;
public Car(int cyl) {
cylinders = cyl;
}
public int getCylinders() {
return cylinders;
}
}
public class SportsCar extends Car {
private int topSpeed;
public SportsCar(int cyl, int top) {
super(cyl);
topSpeed = top;
}
public int getTopSpeed() {
return topSpeed;
}
}
现在,请考虑以下两个对象:
SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);
的以下方法调用编译正常:
lambo.getTopSpeed();
然而,随着错误调用此方法突破“无法找到符号 - 方法getTopSpeed()”
m5.getTopSpeed();
现在我明白getTopSpeed
方法必须在基类中存在以便它因为m5
编译是一个Car
类型,所以如果我包含getTopSpeed
在Car
那么m5.getTopSpeed();
很好地编译。
我的问题是:
- 为什么错误“无法找到符号 - 方法getTopSpeed()”在编译时发生,而不是运行时间?
- 为什么“后期绑定”不能防止这个错误?
- 假设
getTopSpeed
在Car
实现(因此它编译)在程序运行时,不编译器首先检查以查看是否存在getTopSpeed
在Car
,然后检查,看它是否超过深重在SportsCar
还是只是“知道“它已经从编译器中被覆盖了,并直接使用了过度使用的方法?
你的第一个问题,在此的其他问题的回答(http://stackoverflow.com/a/11466790/1079354)可以合理地第一句回答。其他的部分,我会鼓励对JLS的一些细读。 – Makoto
'm5'是'Car'类型的引用变量,这意味着您只能调用'Car'中定义的方法。如果您想使用'SportsCar'中的方法,则必须将'm5'明确地转换为'SportsCar'。 – Logan
编译器无法通过父类型的变量“查看”派生类型的成员。涉及到两种类型,编译器使用的_variable_的声明类型以及JVM使用的_object_的运行时类型。您期待编译器处理_variable_,就好像它可以看到_object_的运行时类型。它不能。 –