2012-06-11 2 views
10

Это вопрос только из любопытства.Java Polymorphism

Я знаю, что когда мы вызываем переопределенный метод объекта подкласса по ссылке его суперкласса, 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) 

Теперь мой вопрос, Есть ли способ, что мы можем использовать эталонную час позвонить метод superclass eat(), а не подкласс? Я знаю, что это вопрос, который несколько противоречит законам полиморфизма, но вы никогда не знаете, когда это может возникнуть.

Я попытался привить ссылку h к животному, но не повезло. Есть идеи?

+0

Возможный дубликат http://stackoverflow.com/questions/5411434/how-to-call-a-superclass-method-using-java-reflection –

+2

А также возможно дубликат HTTP: // StackOverflow. com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

+0

Согласен. Извините, что не пропустил это. Я сделал некоторые исследования, но не смог найти это. – Kameron

ответ

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

Да, не следует вызывать реализацию родительского класса, чтобы придерживаться законов полиморфизма. Я повторно вставьте эту ссылку: http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

4

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

2

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

2

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

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

static void eat(){ 
     System.out.println("Animal is eating..."); 
} 
Смежные вопросы