2012-06-11 5 views
10

Dies ist eine Frage nur aus Neugier.Java Polymorphism

Ich weiß, dass, wenn wir die überschriebene Methode eines Unterklassenobjekts durch die Referenz seiner Oberklasse aufrufen, legt JVM Wert auf den Typ des Objekts und nicht auf den Typ der Referenz.

Das ist mein einfacher Code:

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

Wie erwartet, ich die Ausgabe erhalten:

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

Nun meine Frage ist, Gibt es eine Möglichkeit, die wir Referenz h können anrufen die Superklasse essen() -Methode und nicht die Unterklasse eins? Ich weiß, dass dies eine Frage ist, die etwas gegen die Gesetze der Polymorphie ist, aber man weiß nie, wann die Notwendigkeit dazu besteht.

Ich habe versucht, die Referenz h auf Tier, aber kein Glück zu tippen. Irgendwelche Ideen?

+0

Mögliche Duplikat http://stackoverflow.com/questions/5411434/how-to-call-a-superclass-method-using-java-reflection –

+2

Und auch Duplikat http: // Stackoverflow. com/questions/1032847/can-java-call-parent-überschreiben-method-in-other-objects-but-not-subtype –

+0

Ich stimme zu. Tut mir leid, dass ich es nicht durchgemacht habe. Ich habe etwas recherchiert, konnte das aber nicht finden. – Kameron

Antwort

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

Ja, man sollte nicht die Implementierung der Elternklasse nennen, um die Gesetze des Polymorphismus einzuhalten. Ich werde diesen Link erneut einfügen: http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

4

Nein, Sie werden ausdrücklich so in der überschriebenen Methode zu tun haben (das heißt super.eat()).

2

Sie können dies nicht tun, indem Sie irgendeine Art von Typumwandlung machen. Sie können die Methode der Superklasse nur aufrufen, indem Sie sie entweder wie von Brett Holt gezeigt umhüllen, oder Sie müssen ein Objekt haben, dessen Laufzeittyp Animal ist.

2

In Java - Alle Methoden sind virtuelle Methoden, bei denen beim Aufruf der Funktion die neueste Implementierung verwendet wird.

Um Ihre Frage zu beantworten, machen Sie bitte die Methode static in der Tierklasse, dann erhalten Sie die Eat-Methode der Tierklasse genannt.

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