왜 매개 변수로 아버지 클래스를 얻는 방법은 매개 변수로 자식 클래스를 얻는 방법 불러되지 않는 이유는 무엇입니까?

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");
    }
}

추천

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