当前位置: 首页 > 知识库问答 >
问题:

Java多态性

程赞
2023-03-14

这是一个出于好奇的问题。

我知道,当我们通过引用子类对象的超类来调用子类对象的重写方法时,JVM重视对象的类型,而不是引用的类型。

这是我的简单代码:

class Animal
{
    void eat()
    {
        System.out.println("Animal is eating...");
    }
}
class Horse extends Animal
{
    @Override
    void eat()
    {
        System.out.println("Horse is eating...");
    }
}
public class PolymorphismTest
{
    public static void main(String...args)
    {
        Animal a=new Animal();
        a.eat();

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

正如预期的那样,我得到输出:

run:
Animal is eating...
Horse is eating...
BUILD SUCCESSFUL (total time: 0 seconds)

现在我的问题是,我们有没有办法使用引用h来调用超类ate()方法,而不是子类一?我知道这是一个有点违反多态定律的问题,但你永远不知道什么时候需要这样做。

我试着用打字机把参考h打到动物身上,但没有成功。有什么想法吗?

共有3个答案

金成济
2023-03-14

您不能通过执行任何形式的类型转换来做到这一点。调用超类方法的唯一方法是要么像Brett Holt展示的那样包装它,要么必须有一个对象,其最特定的运行时类型是动物。

闻人英韶
2023-03-14

不,您必须在重写的方法中显式地这样做(即super.eat())。

齐驰
2023-03-14
class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}
 类似资料:
  • 多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。 对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通

  • 问题内容: 出于好奇,这是一个问题。 我知道,当我们通过其超类的引用调用子类对象的重写方法时,JVM会重视对象的类型而不是引用的类型。 这是我的简单代码: 如预期的那样,我得到了输出: 现在我的问题是,有什么方法可以使用引用h调用超类eat()方法,而不是子类?我知道这是一个与多态性定律背道而驰的问题,但是您永远不知道何时会需要这样做。 我试图将参考h转换为Animal,但没有运气。有任何想法吗?

  • 本小节我们来学习面向对象的最后一大特征 —— 多态。多态是面向对象最重要的特性。我们将介绍多态的概念和特点,并带领大家实现一个多态的案例,你将了解到多态的实现条件、什么是向上转型以及什么是向下转型,并学会使用 instanceof 运算符来检查对象引用是否是类型的实例。 1. 概念和特点 多态顾名思义就是多种形态,是指对象能够有多种形态。在面向对象中最常用的多态性发生在当父类引用指向子类对象时。在

  • 问题内容: 我在使用Gson反序列化json字符串时遇到问题。我收到一系列命令。该命令可以是start,stop或其他类型的命令。我自然具有多态性,并且start / stop命令从command继承。 如何使用gson将其序列化回正确的命令对象? 似乎我只获得基本类型,即声明的类型,而从未获得运行时类型。 问题答案: 根据我的研究以及使用gson-2.0时,你确实不想使用registerType

  • 本文向大家介绍Java中的多态性,包括了Java中的多态性的使用技巧和注意事项,需要的朋友参考一下 多态是对象采取多种形式的能力。当使用父类引用来引用子类对象时,会在OOP中最常见地使用多态。 任何可以通过多个IS-A测试的Java对象都被视为多态的。在Java中,所有Java对象都是多态的,因为任何对象都将通过IS-A测试以了解其自身类型和Object类。 重要的是要知道访问对象的唯一可能方法是

  • 有人能提供一个简单的例子来解释Java中动态多态性和静态多态性之间的区别吗?