根據我對動態綁定的理解,JVM在運行時會查看對象的實際類型,並在該類中搜索實現並通過繼承級別進行工作。誤解動態綁定
例如,如果我們有:Vehicle v = new Car();
假設類Car
延伸Vehicle
,我們可以看到,參考變量類型是車輛和物體類型是汽車。
如果我們說:v.start()
:
的JVM會尋找開始實施的方法首先在汽車類,然後在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");
}
}
這段代碼的輸出,符合市場預期是:「汽車類」
這是我的問題:如果我參加了啓動方法從類車輛,完全擦除它,程序將不會運行了。根據我對動態綁定的理解,JVM仍然應該查看對象的實際類型(在本例中爲Car),並仍然運行start方法的汽車實現。但是,它不這樣做。
爲什麼?
因爲該方法不存在。你會得到一個[NoSuchMethodError](http://docs.oracle.com/javase/7/docs/api/java/lang/NoSuchMethodError.html) –
恕我直言,如果你刪除'開始'功能,並做'車v = new Car()'這將是一個編譯器錯誤。由於編譯器檢查LHS對象以驗證調用的函數是否存在於其中。 –
@VusP它取決於他是否修改.class或.java。但是,是的,編譯錯誤更可能。 –