[英]Calling method from java child class not in parent class
考慮以下基類/派生類:
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
類型,所以如果我在Car
包含getTopSpeed
那么m5.getTopSpeed();
編譯得很好。
我的問題是:
getTopSpeed
在程序運行時在Car
中實現(所以它編譯),編譯器是否首先檢查Car
是否存在getTopSpeed
,然后檢查它是否在SportsCar
被覆蓋,或者只是“知道”它已經從編譯器中過度使用並直接使用過度使用的方法? Java是靜態類型語言,因此在編譯時應該知道變量類型。 如果編譯器已知的類型沒有公開這樣的方法 - 則編譯失敗。 正是因為不讓它運行的原因。
為什么要這樣? 它只是發現方法體遲到了,而不是簽名。 但是,靜態類型意味着必須在編譯時滿足簽名。
在運行時,JVM嘗試查找最具體的實現。 在SportsCar中,在您的情況下。 如果它是從父級繼承而在子級中不存在 - 則使用父級代碼。
如果需要從變量類型中缺少的特定子項調用方法 - 您可以在運行時將其強制轉換為ClassCastException。
這是因為當編譯器看到這個時:
SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);
它知道lambo是一款SportsCar,但只知道m5是一輛Car。 如果你想獲得m5的最高速度,你必須先將它投射到SportsCar:
((SportsCar)m5).getTopSpeed();
然而,大多數時候我看過鑄造,變量首先被轉換為另一個變量:
SportsCar sportsM5 = (SportsCar)m5;
sportsM5.getTopSpeed();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.