【发布时间】:2019-02-06 11:01:31
【问题描述】:
我有一个名为 A 的类,以及一个扩展 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 类中的 f1(因为 a 属于 A 类型),这实际上发生了。然后我期待这条线 f1((B)a);被调用,因为 a 是 B 的一个实例。到目前为止,一切都按预期进行。但是,我认为下一个将被调用的方法是 B 类中的 f1(B)。相反,A 类中的 f1(A) 被一遍又一遍地调用,导致堆栈溢出异常。为什么不调用 B 类中的 f1(B)? B 的一个实例是调用者,参数被强制转换为 B 类型。
【问题讨论】:
-
因为f1()是实例方法,B的实例知道它的实例方法,而不是A的实例方法。反过来也一样
标签: java oop inheritance polymorphism dynamic-binding