我有一个名为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)");
}
.
.
.
}
我期望A类中的f1首先被调用(因为a是A类型)实际发生了.然后我预料到行f1((B)a);被称为,因为a是B的一个实例.到现在为止,一切都按预期进行.但是,我认为下一个将被调用的方法是B类中的f1(B).相反,A类中的f1(A)被反复调用,导致堆栈溢出异常.为什么不叫B级的f1(B)? B的一个实例是调用者,参数被强制转换为B类.