Java多态性

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

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

我试图将参考h强制转换为Animal但没有运气。 有任何想法吗?

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

不,你必须在重写方法(即super.eat() )中明确地这样做。

你不能通过任何forms的类型转换来做到这一点。 调用超类方法的唯一方法是像Brett Holt那样包装它,或者你必须有一个最具体的运行时类型为Animal的对象。

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

要回答你的问题,请在Animal类中使方法为static ,然后你将获得名为Animal类的eat方法。

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