考慮以下基本/派生類:從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_的運行時類型。它不能。 –