【问题标题】:Java PolymorphismJava 多态性
【发布时间】:2012-06-14 15:50:45
【问题描述】:

这个问题只是出于好奇。

我知道当我们通过引用它的超类来调用子类对象的覆盖方法时,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 类型转换为 Animal 但没有运气。有什么想法吗?

【问题讨论】:

标签: java polymorphism overriding


【解决方案1】:
class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}

【讨论】:

【解决方案2】:

不,您必须在被覆盖的方法中明确地这样做(即super.eat())。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      要回答你的问题,请在 Animal 类中创建 static 方法,然后你会得到 Animal 类的 eat 方法被调用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-16
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2016-06-25
        • 2017-10-21
        • 1970-01-01
        相关资源
        最近更新 更多