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

Я попытался напечатать ссылку h на Animal, но безуспешно. Есть идеи?

 Akhi11 июн. 2012 г., 20:11
Возможный дубликатstackoverflow.com/questions/5411434/…
 Andrea Parodi11 июн. 2012 г., 20:13
Джон Скит (очевидно) дал действительно хороший ответ
 Andrea Parodi11 июн. 2012 г., 20:13
А также возможный дубликатstackoverflow.com/questions/1032847/…
 Kameron11 июн. 2012 г., 20:13
Согласен. Извините, что не прошел через это. Я провел некоторое исследование, но не смог найти это.

Ответы на вопрос(4)

Решение Вопроса
class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}
 12 июн. 2012 г., 07:36
Да, нельзя называть родительский класс » реализация для того, чтобы придерживаться законов полиморфизма. Я снова вставлю эту ссылку:stackoverflow.com/questions/1032847/…

super.eat()).

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

которые используются в самых последних реализациях при вызове функции.

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

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

Ваш ответ на вопрос