当前位置: 首页 > 面试题库 >

覆盖Java中的方法,然后将对象强制转换为父类行为

卫弘图
2023-03-14
问题内容

我有一个父类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”下面的代码)。

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


问题答案:

这是多态性的基础

它应该像那样工作。

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

将对象转换为其他类型时,只需使用其他类型进行引用即可。对象的实际类型不变。(它永远不会改变)。

因此,您正在观察的行为是预期的,并且设计为是这种方式。绝对不是限制。

希望这可以帮助。



 类似资料:
  • 对API控制器的远程调用(通过RestTemboard)(从一侧返回已知对象的List([]),从远程侧返回未知类型的对象)返回

  • 我在一个扩展的asynctask中得到了这个错误,但我确信Object[]是一个void[]。 这是我的自定义AsyncTask: 我是这样叫execute的:

  • 在通用堆栈的实现中,使用了以下习惯用法,并且没有任何问题 但是,当我尝试以下操作时,它会导致ClassCastException 这个你怎么解释?

  • 我有一种方法,可以按照班级团队中的国家对数据库中的数据进行排序。Hibernate在列表中返回我的数据 我的错误日志: 我的冠军联赛课程: 我的班级: }

  • 例如:Date值为:“dateCollected”:fri Jul 07 00:00:00 IST 1989, 但它只服用星期五而不是整个日期。

  • 假设我有一个继承链,其中每个类都通过添加一个新字段来扩展其超类,我希望该链的每个类都覆盖方法,如下所示: 如果我使用抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起的所有子类也通过继承已经实现的方法变得具体。 Java中有没有一种方法可以强制每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高?