重载和重写方法中的多态

重载和重写方法中的多态,第1张

重载和重写方法中的多态

我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。

让我们先更正此语句。变量

ah
类型的引用,
Animal
并且该语句
newHorse()
创建类型的实例
Horse
并将其分配给
Animal
引用。

现在,术语已经很清楚了,这种行为是可以预期的,并被称为运行类型多态或动态方法分派。在编译时,

eat()
将基于的引用类型进行解析
Animal
,但是在运行时,将被调用的方法基于
实例 类型来进行解析
Horse

当我有一个引用对象类型的泛型引用变量类型时,如何确定编译器将要调用哪种方法?

您可以按照以下简单步骤 *** 作:

  1. 检查被调用的方法。
    ah.eat()
    正在调用方法
    eat
  2. 查看父类和子类中是否都存在签名完全相同的方法(例外是返回类型协方差)。(是否已覆盖方法?)
  3. 检查参考类型。在中
    Animal ah = new Horse()
    ,引用类型是
    Animal
    父类
  4. 检查实例类型。在中
    Animal ah = new Horse()
    ,实例类型是
    Horse
    子类。

如果满足上述所有条件,则您正在查看运行类型多态性,并且将从子类中调用该方法。在任何其他情况下,将基于引用类型解析要调用的方法。

还需要了解子类从其父类继承方法。假设您

public void eat()
Horse
类中删除了该方法,那么您将不再 覆盖
eat()
方法;然而,
public void eat(String s)
在方法
Horse
仍称 重载
继承
eat
的方法
Animal
。接下来,让我们在中添加一个
public void eat(Strings)
方法
Animal
。有了这个此外,你现在 超载
eat
在方法
Animal
Overrding
在它
Horse
的类。无论您如何更改代码,上面提到的4个步骤都将始终帮助您确定将调用哪种方法。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5438934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存