Ответ 1
class Horse extends Animal
{
@Override
void eat()
{
super.eat();
}
}
Это вопрос только из любопытства.
Я знаю, что когда мы вызываем переопределенный метод объекта подкласса по ссылке суперкласса, 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, но не повезло. Любые идеи?
class Horse extends Animal
{
@Override
void eat()
{
super.eat();
}
}
Нет, вам придется явно делать это в переопределенном методе (т.е. super.eat()
).
Вы не можете сделать это, выполнив любую форму приведения типов. Ваш единственный способ вызвать метод суперкласса - либо обернуть его, как показал Бретт Холт, либо у вас должен быть объект, наиболее специфичным для которого является время жизни.
В Java - все методы - это виртуальные методы, которые используются в последнее время при вызове функции.
Чтобы ответить на ваш вопрос, пожалуйста, сделайте метод static
в классе Animal, после чего вы получите метод питания класса Animal.
static void eat(){
System.out.println("Animal is eating...");
}