java - 覆盖java中的方法然后将对象转换为父类行为

标签 java inheritance

我有一个父类 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/

相关文章:

WPF:包含控件与继承控件的自定义 UserControl

c++ - 从多个组件构建一个 C++ 类

c# - 如何在 C# 中隐藏基类属性?

java - 创建jar时选择主类

c++ - 更紧密地打包位域

java - Intent 中的 Action_Send_Multiple 不起作用

java - 如何从Netbeans java项目制作exe文件以在所有没有JVM的系统中运行?

c++ - 这段代码安全吗?将 std::vector<Derived*> 转换为 std::vector<Base*>

java - main方法抛出异常是什么意思?

java xpath 从 xml 中删除元素