gpt4 book ai didi

java - 为什么调用获取父类作为参数的方法,而不调用获取子类作为参数的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:38 26 4
gpt4 key购买 nike

我有一个名为 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(A a) 是类A 的一个实例方法。它不知道 A 的子类的方法。因此,它不能调用 B 类的 void f1(B b)。因此,f1((B)a)再次执行了void f1(A a)

如果你想调用 f1(B b),你必须在类 B 的实例变量上调用 f1:

public void f1(A a){
if(a instanceof B) {
B b = (B)a;
b.f1(b);
} else {
System.out.println("Nothing");
}
}

关于java - 为什么调用获取父类作为参数的方法,而不调用获取子类作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com