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

重载和重写方法中的多态

轩辕煌
2023-03-14
问题内容

让我们看一下这个简单的Java代码

public class Animal {
  public void eat() {
    System.out.println("Generic Animal Eating Generically");
   }
}

public class Horse extends Animal {
  public void eat() {
    System.out.println("Horse eating hay ");
  }

  public void eat(String s) {
    System.out.println("Horse eating " + s);
  }
}

我试图找出三个eat()方法的哪个版本。现在,当我键入

Animal a = new Animal();
a.eat();

输出是“一般动物食用”,这是完全可以理解的。

当我键入以下内容时,会发生相同的事情:

Horse h = new Horse();
h.eat();

输出是“吃干草的马”,这完全是合乎逻辑的。

这就是让我感到困惑的地方。当我键入:

Animal ah = new Horse();
ah.eat();

我得到:

Horse eating hay

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

所以我的问题是,当我有一个引用对象类型的通用引用变量类型时,我如何才能确定编译器将调用哪种方法(像这样:Animal horse = new
Horse();)。


问题答案:

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

让我们先更正此语句。变量ah是类型的引用,Animal并且该语句new Horse()创建类型的实例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(String s)方法Animal。有了这个此外,你现在 超载eat在方法AnimalOverrding
在它Horse的类。无论您如何更改代码,上面提到的4个步骤都将始终帮助您确定将调用哪种方法。



 类似资料:
  • 让我们用这个简单的Java代码: 我试图找出这三个ate()方法的哪个版本将运行。现在,当我键入 结果是“普通动物一般地吃”,这是完全可以理解的。 当我输入时也会发生同样的事情: 结果是“吃干草的马”,这也是完全合乎逻辑的。 这就是我困惑的地方。当我输入: 我得到: 我期望编译器从动物类引用调用ate()方法,而不是马对象引用。 所以我的问题是,当我有一个泛型引用变量类型引用一个对象类型时(比如:

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式

  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

  • 本文向大家介绍java中重载,继承,重写和多态的区别,包括了java中重载,继承,重写和多态的区别的使用技巧和注意事项,需要的朋友参考一下 重载,继承,重写和多态的区别: 1)继承是子类获得父类的成员。 2)重写是继承后重新实现父类的方法。 3)重载是在一个类里一系列参数不同名字相同的方法。 4)多态则是为了避免在父类里大量重载引起代码臃肿且难于维护。 网上看到一个有趣的说法是:继承是子类使用父类

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • 问题内容: 我正在努力了解为什么在Java中 需要方法重载和重写 ? 我已经阅读了一些与此相关的文章,但无法理解为什么实际上需要它? 我还访问了以下url,但在该主题中我还不清楚。 Java重载和覆盖 任何实际的例子将不胜感激。 提前致谢。 问题答案: 来自doc的 方法重载: 假设您有一个可以使用书法绘制各种类型的数据(字符串,整数等)的类,并且包含一个用于绘制每种数据类型的方法。为每个方法使用