왜 JVM은 상속 트리의 부모에 대한 자녀의 메소드를 검색합니까?

M06494h :

저는 여기에서 찾고과 유사한 방법이 상위에 존재하고 참조 유형의 부모입니다하지만, 경우 개체 유형의 경우 JVM이 항상 자식 클래스의 메소드를 찾는 이유를 알고 싶으면 예제 코드는 아이.

class A{
    public void saveLink(){
        System.out.println("A: saveLink");
        bookmark();
    }
    public void bookmark() {
        System.out.println("A: bookmark");
    }
}

class B extends A{
    public void bookmark(){
        System.out.println("B: bookmark");
    }
}

class C extends B{

}   

class Test {
    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        A c = new C();

        c.saveLink();
    }
}

나는 위의 코드를 실행하면 그것은 출력 :

A: saveLink
B: bookmark

누군가가 더 이것에 대해 설명해 주시겠습니까?

ernest_k :

이 다형성은 자바로 구현되는 방법 중 하나입니다. 그것은 동적 바인딩이라고도합니다.

런타임시에 실행되는 구현 메소드가 호출되는 객체의 실제 수준의보고에 의해 결정된다.

당신이 선언 할 때 귀하의 경우에는, A b = new B();다음 전화를하고 b.bookmark(), 자바 런타임에서 처음 보이는, 객체의 실제 타입 ( B오브젝트가 생성되었을 때 실행시의 형태이다 new B()상관없이 정적, 또는 선언의 선언 된 유형 (즉, regarless는) 오브젝트를 가리키는 변수)의 종류.

자바 메소드 (이 객체의 경우 런타임 클래스에서 재정의 된 것을 볼 때 b귀하의 예제에서), 그 구현을 실행합니다. 그렇지 않으면, 당신이 언급 한 것처럼 (이 객체의 경우, 상속 구현을 찾을 수있는 클래스 계층 구조를 걸어 c귀하의 예제에서).


참고 :

  • 이 문제는 단지에 대한위한 인스턴스 메소드 (이 필드 정적 메소드 또는 적용되지 않음). 정적 메소드는 선언 / 정적 유형에 따라 선택된다.
  • 예외가 (내가 생각할 수)있다 : 통화가 함께 할 때 super.bookmark(), 다음 자바는 반드시 슈퍼 클래스의 구현을 실행 -이 당신의 예제 시나리오가 아닙니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=192700&siteId=1