У меня есть класс с именем A и класс с именем B, который расширяет A. Играя с некоторыми методами для понимания полиморфного поведения, я столкнулся со странной ситуацией.
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)");
}
.
.
.
}
Я ожидал, что f1 в классе A будет вызываться первым (потому что a имеет тип A), что и произошло. Затем я ожидал строку f1((B)a); для вызова, так как a является экземпляром B. До сих пор все шло так, как ожидалось. Однако я думал, что следующим будет вызываться метод f1(B) в классе B. Вместо этого f1(A) в классе A вызывался снова и снова, вызывая исключение переполнения стека. Почему не вызвали f1(B) в классе B? Экземпляр B был вызывающим, и параметр был приведен к типу B.