我有一个父类 A 和一个子类 B,B 重写了 A 的方法 f。
public class A
{
public String f()
{
return "A";
}
}
public class B extends A
{
...
public String f()
{
return "B";
}
public static void main(String[] args)
{
B b = new B();
A a = (A) b;
System.out.println(b.f()); //prints: B
}
}
我创建了一个 B 类型的对象 b,并将其转换为 A 类型并将其分配给 A 类型的变量 a,然后调用 a 上的方法 f。现在我希望调用父类的方法,因为我正在使用类型 A 的对象,但它没有,它调用方法的 b 版本(打印“B”而不是“A”下面的代码)。
为什么会这样?是设计决定还是技术限制?
最佳答案
这是多态性的基础
它应该是这样工作的。
任何方法都是根据对象的实际类型而不是引用它的类型动态调度(选择/调用)的。
当您将对象转换为另一种类型时,您只需使用另一种类型来引用它。对象的实际类型没有改变。 (而且它永远不会改变)。
因此,您观察到的行为符合预期,而且设计就是这样。这绝对不是限制。
希望这对您有所帮助。
关于java - 覆盖java中的方法然后将对象转换为父类行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22874640/