Wie zum Aufruf der überschriebenen Methode der übergeordneten Klasse?
Wie kann ich rufen Sie das Essen und trinken Methode der Animal
Klasse mit der myAnimal
Instanz im code?
public class Animal {
public void eat() {
System.out.println("Animal Eats");
}
public void drink() {
System.out.println("Animal Drinks");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("Cat Eats");
}
@Override
public void drink() {
System.out.println("Cat Drinks");
}
public static void main(String[] args) {
Cat myCat = new Cat();
myCat.eat();
myCat.drink();
Animal myAnimal = myCat;
myAnimal.eat();
myAnimal.drink();
}
}
Ausgabe, die ich erhalte:
Cat Eats
Cat Drinks
Cat Eats
Cat Drinks
Dies ist meine erwartete Ausgabe:
Cat Eats
Cat Drinks
Animal Eats
Animal Drinks
Sie möchten, rufen Sie die
Es sei denn, Sie haben eine Methode, die in
Sie sollten nicht erwarten, dass das, was Sie erwartet ... sollte das nicht sowohl in Bezug auf die Sprache der definition und im Sinne von dem, was ist vernünftig oder erstrebenswert zu wollen. Der springende Punkt bei der Vererbung-Polymorphismus ist zu bekommen, was Sie sehen und nicht das, was Sie sagen, Sie erwarten.
Während Ihre Bearbeitungen @Michael, beseitigt (!) was als anstößig betrachtet werden können, die in manchen Kreisen, es war ein derber Humor, dass ich (als Katze Liebhaber) anerkannt und mit dem Zusatz von einer Dritten Methode
animal
Umsetzung ohne die cat
Umsetzung?Es sei denn, Sie haben eine Methode, die in
Cat
Hexe ruft super.eat();
Sie es nicht direkt von Cat
Sie sollten nicht erwarten, dass das, was Sie erwartet ... sollte das nicht sowohl in Bezug auf die Sprache der definition und im Sinne von dem, was ist vernünftig oder erstrebenswert zu wollen. Der springende Punkt bei der Vererbung-Polymorphismus ist zu bekommen, was Sie sehen und nicht das, was Sie sagen, Sie erwarten.
Während Ihre Bearbeitungen @Michael, beseitigt (!) was als anstößig betrachtet werden können, die in manchen Kreisen, es war ein derber Humor, dass ich (als Katze Liebhaber) anerkannt und mit dem Zusatz von einer Dritten Methode
sleep()
die ursprüngliche Frage würde Modell Katzen, die ich erlebt habe, ganz gut. Auf der anderen Seite viele Menschen würden nicht einen Klumpen von dem, was wurde umgewandelt, hier... 8-PInformationsquelleAutor Hisham Muneer | 2013-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht tun, was Sie wollen. Der Weg Polymorphismus funktioniert, ist, indem Sie tun, was Sie sehen.
Grundsätzlich eine Katze weiß immer, es ist eine Katze und wird immer so Verhalten, wie eine Katze, unabhängig davon, ob Sie zu behandeln ist wie eine Katze, Felis, Felinae, Felidae, Feliformia, Carnivora, Theria, Mammalia, Subphylum, Chordata, Eumetazoa, Animalia, Tier, Objekt oder etwas anderes 🙂
100% sicher, dass da der code, den Sie schreiben wollen. Ich nach einer anderen Antwort, das lassen Sie tun, was Sie zu tun versuchen, aber es wird nicht das sein, was Sie wollen...
Ich warf Reflexion zu diesem thread
Reflexion wird es nicht tun... 🙂
Reflection (java.lang.reflektieren) können Sie, unter anderem, die Methoden aufrufen, indem Sie Ihren Namen (übergeben als string). Aber es wird noch nicht helfen, da es den gleichen Regeln folgt, wie das, was passiert in dem code, den Sie geschrieben, um mit zu beginnen.
InformationsquelleAutor TofuBeer
Hier haben Sie die Möglichkeit zu wählen, welche Methode Sie aufrufen möchten:
InformationsquelleAutor Andrii Dzhyrma
Diese Zeile:
Animal myAnimal = myCat;
weist die variable
myAnimal
auf das ObjektmyCat
, die Sie erstellt haben, bevor. Also, wenn Sie rufenmyAnimal.eat()
nach, dass man tatsächlich den Aufruf der Methode von der ursprünglichen myCat-Objekt, das AusgabenCat Eats
.Wenn Sie ausgeben möchten
Animal Eats
Sie müssen zum zuweisen einerAnimal
Instanz an eine variable. Also, wenn Sie dies tun, statt:Animal myAnimal = new Animal()
die variable myAnimal wird eine Instanz von
Animal
, und so überschreibt die Vorherige Zuordnung zuCat
.Wenn Sie anrufen
myAnimal.eat()
nach, bist du eigentlich aufrufen dereat()
Methode derAnimal
Instanz, die Sie erstellt haben, die AusgabeAnimal Eats
.Schluss: sollte Ihr code Lesen:
InformationsquelleAutor Piet van Dongen
Das ist das Gegenteil von dem, was passiert im Fall von Instanz-Methoden.
Im Fall von Instanzen-Methoden die Methode der tatsächlichen Klasse des Objekts genannt wird.
In diesem Beispiel, obwohl die das Objekt myCat zugeordnet ist, um ein Tier-Objekt-Referenz (
Animal myAnimal = myCat
) das Eigentliche Objekt ist vom TypCat
und es sich so verhält, wie es eine Katze ist.Hoffe, das hilft.
InformationsquelleAutor tharindu_DG
Können Sie erstellen Konstruktor für die Klasse Tier, das dauert weitere Animas als parameter und erzeugt neue Instanz auf der Basis von zur Verfügung gestellt.
InformationsquelleAutor friednail
Wenn Sie die Methoden in jeder Klasse statisch ist, sollte es funktionieren.
Den oben genannten code, geben Sie die folgende Ausgabe
InformationsquelleAutor Vbee
Paar Vorschläge :
Don ' T-pass-Kind-class-Referenz auf super Klasse und außer super-Klasse-Methode muss aufgerufen werden, die für die überschriebene Methode. Rufen Sie super Klasse Methoden aus der super-Klasse-Instanz.
Wenn Sie möchten, rufen super-Klasse-Methode aus der abgeleiteten Klasse explizit aufrufen, super Klasse name der Methode mit super.methodName();
InformationsquelleAutor Ravindra babu
AUSGABE:
Müssen Sie erstellen ein Objekt von der super-Klasse
Animal
ODER eine andere Möglichkeit ist die Verwendung des keyword -super
in der abgeleiteten Klasse Methoden, z.B.super.eat()
odersuper.drink()
InformationsquelleAutor cNgamba
Katze kann nicht aufhören, eine Katze, auch wenn es ein Tier ist. Katze Essen und Katze trinken bei einer Katze ist Weg. Es kann ähnlich zu dem, was ein Tier tut, das ist, warum es überschreibt die Methode. Wenn Sie möchten, es zu tun, was das Tier hat standardmäßig überschreiben nicht. Sie könnten wahrscheinlich tun einige seltsame Sachen mit Reflexion und stellen Sie verschiedene Methoden, die Zugriff auf die übergeordnete Methoden wie:
aber das wäre des guten zuviel, meinst du nicht?
Natürlich, dass würde wahrscheinlich nicht funktionieren, da es nicht statisch.
InformationsquelleAutor Jimi Kimble
Bitte nicht die Abstimmung über diese Antwort... können Sie Stimmen auf der anderen ein 🙂 Dies ist eine schlechte Antwort, aber er zeigt, wie Sie tun würde, was Sie versuchen zu tun... schlecht.
Nicht wirklich, es ist da, um den Menschen zu zeigen, was nicht zu tun. Jemand kann kommen mit diesem, ich wollte die Leute wissen lassen, dass, wenn Sie haben, dann sollten Sie es wegwerfen. Daher meine Anfrage an Sie nicht abstimmen...
Ich denke, es wäre besser, wenn diese waren in einem Abschnitt Ihrer Antwort akzeptiert.
InformationsquelleAutor TofuBeer