Ronen에 Hanukayev :
나는 이상한 상황에 달렸다 명명 된 클래스, 그리고 다형성 행동을 이해하기 위해 몇 가지 방법으로 A. 극을 확장 B라는 클래스가 있습니다.
public class Main {
public static void main(String[] args){
B b = new B();
A a = b;
b.f1(a);
}
}
public class A {
.
.
.
public void f1(A a){
if(a instanceof B)
f1((B)a);
else
System.out.println("Nothing");
}
.
.
.
}
public class B extends A {
.
.
.
public void f1(B b){
System.out.println("B::f1(B)");
}
.
.
.
}
나는 실제로 발생하는 (A는 A 형의 때문에) 클래스 A에서 F1이 먼저 호출 될 것으로 예상. 그럼 광고 F1 ((B) A)을 예상; A는 모든 것이 예상대로 갔다 지금까지 B의 인스턴스이기 때문에, 호출 할 수 있습니다. 단, I는 호출되는 다음 방법 대신 클래스 B의 F1 (B)와,이 이상이라고하고 스택 오버 플로우 예외를 유발 끝난 클래스 F1 (A) 인 것을 생각했다. 이유는 클래스 B에서 F1 (B)가 호출되지 않은? B의 경우는 발신자이고 파라미터를 B. 형식으로 캐스팅 하였다
그들은했다 :
f1(A a)
클래스의 인스턴스 메소드이다 A
. 그것은의 하위 클래스의 방법에 대한 지식이 없습니다 A
. 따라서 호출 할 수 없습니다 void f1(B b)
클래스의 B
. 따라서, f1((B)a)
실행 void f1(A a)
다시.
통화 할 경우 f1(B b)
, 당신은 전화를해야합니다 f1
클래스의 인스턴스 변수에 B
:
public void f1(A a){
if(a instanceof B) {
B b = (B)a;
b.f1(b);
} else {
System.out.println("Nothing");
}
}