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()
, 다음 자바는 반드시 슈퍼 클래스의 구현을 실행 -이 당신의 예제 시나리오가 아닙니다.