重写 java 中的方法,然后将对象强制转换为父类行为

2022-09-04 07:21:47

我有一个父类 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”)。

为什么会这样?这是设计决策还是技术限制?


答案 1

这是多态性的基础

它应该像那样工作。

任何方法都是根据对象的实际类型动态调度(选择/调用)的,而不是引用它的类型。

将对象强制转换为另一种类型时,只需使用另一种类型来引用它。对象的实际类型不会更改。(而且它永远不会改变)。

因此,您正在观察的行为是预期的,并且被设计成这样。这绝对不是一个限制。

希望这有帮助。


答案 2

这是一个设计决策。您已经创建了一个类型为“B”的对象,因此它就是这样。

当你把它强制转换为A时,你只是告诉解释器,在类型A的类中找到的方法可用于B,但是由于你有一个@Override B的方法,它将使用它。


推荐