我有一个父类A,和一个子类,B和B覆盖了一个方法f,来自A.
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
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个类型为B,b的对象,并将其转换为类型A并将其分配给类型为A的变量a,然后在a上调用方法f.现在我希望调用父类的方法,因为我正在处理类型A的对象,但它没有,它调用方法的b版本(打印"B"而不是"A")下面的代码).
为什么会这样?这是设计决策还是技术限制?
Tan*_*til 17
它应该像那样工作.
根据对象的实际类型而不是引用它的类型动态地分派(选择/调用)任何方法.
将对象转换为其他类型时,只需使用其他类型引用它.对象的实际类型不会更改.(它永远不会改变).
因此,您正在观察的行为符合预期,并且它的设计就是这样.这绝对不是限制.
希望这可以帮助.