2012-06-11 5 views
10

To jest pytanie tylko z ciekawości.Java Polymorphism

Wiem, że gdy nazywamy nadpisaną metodą obiektu podklasy przez odniesienie jej nadklasy, JVM nadaje ważność typowi obiektu, a nie typowi odniesienia.

To jest mój prosty kod:

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(); 
    } 
} 

Zgodnie z oczekiwaniami, pojawia się komunikat:

run: 
Animal is eating... 
Horse is eating... 
BUILD SUCCESSFUL (total time: 0 seconds) 

Teraz moje pytanie brzmi, Czy istnieje jakiś sposób, że możemy użyć odniesienia h zadzwonić metoda superclass eat(), a nie podklasa? Wiem, że jest to kwestia nieco sprzeczna z prawami polimorfizmu, ale nigdy nie wiadomo, kiedy może zaistnieć taka potrzeba.

Próbowałem typografią odniesienia h do Animal, ale bez powodzenia. Jakieś pomysły?

+0

Możliwy duplikat http://stackoverflow.com/questions/5411434/how-to-call-a-superclass-method-using-java-reflection –

+2

A także możliwy duplikat http: // stackoverflow. com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

+0

Zgadzam się. Przepraszam, że tego nie przeżyłem. Zrobiłem trochę badań, ale nie mogłem tego znaleźć. – Kameron

Odpowiedz

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

Tak, nie należy nazywać implementacji klasy macierzystej, aby zachować zgodność z prawami polimorfizmu. Wkleję ten link ponownie: http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

4

Nie, będziesz musiał wyraźnie zrobić w zastąpionej metodzie (tj super.eat()).

2

Nie można tego zrobić, wykonując jakąkolwiek formę typowania. Jedynym sposobem na wywołanie metody nadklasy jest jej owijanie tak jak pokazał Brett Holt, lub musisz mieć obiekt, którego najbardziej specyficznym typem środowiska wykonawczego jest Animal.

2

W języku Java - Wszystkie metody są metodami wirtualnymi, które są używane podczas wywoływania funkcji.

Aby odpowiedzieć na pytanie, należy wykonać metodę static w klasie zwierząt, a następnie otrzymasz metodę jedzenia klasy zwierząt o nazwie.

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