제목이 오해의 소지가 있지만 비 원어민 인 경우 더 좋은 것을 알아 내지 못했습니다. hybrid
실제로 "RingdingRingding"
때문에 기대했던 1 OUPUT을 위해 몇 가지 방법참조 할 클래스 유형과 호출 할 메소드를 결정하는 실제 클래스 유형?
Fox foxi = new Fox();
Dog hybrid = new Fox();
System.out.println(hybrid.play(foxi)); // Output number 1
System.out.println(foxi.play(hybrid)); // Output number 2
전화
public class Dog {
public String bark() {
return "Wuff";
}
public String play(Dog d) {
return "Wuff" + d.bark();
}
}
public class Fox extends Dog {
public String bark() {
return "Ringding" ;
}
public String play(Fox f) {
return "Ringding" + f.bark();
}
}
그리고 나뿐만 아니라 일부 인스턴스를 생성 :
내가 두 개의 클래스,Dog
및
Fox
을 말해봐 참조가 유형이
Dog
인 경우에도
Dog
의 인스턴스에 대한 참조는 여전히 참조됩니다
Fox
객체들, 여전히 난이 출력 얻었다 :
foxi
때문에
WuffRingding
저도 같은 문제가있어 두 번째는, Fox
및 hybrid
의 인스턴스가 실제로 Fox
의 인스턴스이다 (? 무슨 일이 있어도 참고, 오른쪽)의 OUPUT는 "RingdingRingding"
없어야하지만 다시, 내가 가지고 :
이
을 WuffRingding
이유를 설명 할 수 있습니까?
중요한 것은'Fox.play (Fox)'가'Dog.play (Dog)'를 덮어 쓰지 않는다는 것입니다. 하이브리드 타입이'Dog'이기 때문에,'play (Dog)'오버로드가 호출됩니다. –
@AndyTurner 안녕하세요, 앤디 당신의 대답에 감사드립니다. 타입 캐스팅에 관해서도, 액추럴 타입은 중요합니까? Fox (Fox)의 인스턴스에 (Dog)를 캐스팅하고 껍질 메서드를 호출한다고 가정 해 봅시다. Fox 클래스의 메서드가 될 것입니다. 그렇습니까? 참조와 캐스팅 사이에 다소 혼란 스럽습니다. –
호출 할 메서드는 런타임이 아닌 컴파일 타임에 결정됩니다. 따라서 메소드에 'Dog'에 대한 참조를 전달하면 런타임에 'Fox'를 참조하는 경우에도 'Dog'를 사용하는 오버로드가 호출됩니다. –