Полиморфизм 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 для вызова метода superclass eat(), а не подкласса? Я знаю, что это вопрос, который несколько противоречит законам полиморфизма, но вы никогда не знаете, когда может возникнуть необходимость в этом.

Я попытался привить ссылку h к Animal, но не повезло. Любые идеи?

Ответ 1

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

Ответ 2

Нет, вам придется явно делать это в переопределенном методе (т.е. super.eat()).

Ответ 3

Вы не можете сделать это, выполнив любую форму приведения типов. Ваш единственный способ вызвать метод суперкласса - либо обернуть его, как показал Бретт Холт, либо у вас должен быть объект, наиболее специфичным для которого является время жизни.

Ответ 4

В Java - все методы - это виртуальные методы, которые используются в последнее время при вызове функции.

Чтобы ответить на ваш вопрос, пожалуйста, сделайте метод static в классе Animal, после чего вы получите метод питания класса Animal.

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