爪哇多态性



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

我知道,当我们通过引用

它的超类来调用子类对象的重写方法时,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 来调用超类 eat() 方法而不是子类方法?我知道这是一个有点违反多态定律的问题,但你永远不知道什么时候需要这样做。

我试图将引用h键入动物,但没有运气。有什么想法吗?

class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}

不,您必须在重写的方法中显式执行此操作(即 super.eat() )。

不能通过执行任何形式的类型转换来执行此操作。调用超类方法的唯一方法是像 Brett Holt 所示的那样包装它,或者您必须有一个对象,其最具体的运行时类型是 Animal。

在 Java 中 - 所有方法都是虚拟方法,在调用函数时使用最新的实现。

要回答您的问题,请将该方法static在动物类中,然后您将获得称为动物类的吃方法。

static void eat(){ 
      System.out.println("Animal is eating..."); 
}

最新更新