JVM은 동적 바인딩에 대해 이해했기 때문에 런타임에 객체의 실제 유형을 살펴보고 해당 클래스에서 구현을 검색하고 상속 수준까지 올라간다.동적 바인딩에 대한 오해의 소감
우리가 예를 들어 :
Vehicle v = new Car();
클래스 Car
Vehicle
이 연장된다고 가정하면, 우리는 기준 가변형 차량이며 개체 유형 차량임을 알 수있다.
우리가 말한다면 : v.start()
을 :
JVM이 Vehicle 클래스에서 먼저 Car 클래스에 다음 start 메소드 구현에 보일 것이다.
이의 예는이 코드에 있습니다
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");
}
}
예상대로이 코드의 출력은 다음과 같습니다 "자동차 클래스"이것은 내 질문에
입니다 : 내가 시작 방법을 취할 경우 Vehicle 클래스에서 완전히 지우면 프로그램이 더 이상 실행되지 않습니다. 내가 동적 바인딩에 대해 이해하는 것으로부터 JVM은 여전히 객체의 실제 유형 (이 경우 Car)을 살펴보고 start 메소드의 자동차 구현을 실행해야합니다. 그러나, 그렇게하지 않습니다.
왜?
메서드가 존재하지 않기 때문에. 'NoSuchMethodError '(http://docs.oracle.com/javase/7/docs/api/java/lang/NoSuchMethodError.html) –
IMHO 당신이'start' 함수를 제거하고'Vehicle v = new Car()'컴파일러 오류가 발생합니다. 컴파일러는 LHS 객체를 검사하여 호출 된 함수가 존재하는지 여부를 확인합니다. –
@VusP 그는 .class 또는 .java를 수정했는지에 따라 다릅니다. 하지만 그래, 컴파일 오류가 더 가능성이 높습니다. –