Ich lese das SCJP-Buch von Kathy Sierra. Ich finde Polymorphismus ein wenig verwirrend.
Könnten Sie mir bitte mit einem realen Beispiel für das folgende helfen?
Ich verstehe, dass Polymorphismus nur funktioniert, wenn Sie Methoden außer Kraft gesetzt haben, egal ob Sie dies über die Klasse oder die Schnittstelle tun, und zur Laufzeit bestimmt die JVM die Methode basierend auf dem Objekttyp.
Sagen wir, Pferd dehnt sich von Animal aus und überschreibt auch die Methode eat (). Was ist der Vorteil von doing: Animal a = new Horse(); a.eat();
über Horse b = new Horse();
b.eat();
?
Irgendwann wird das Ergebnis dasselbe sein. Ich entschuldige mich für eine sehr grundlegende Frage, aber selbst alle leitenden Entwickler in meinem Team gaben mir alle verschiedene Antworten.
Um Ihr Beispiel zu erweitern, sagen Sie, Sie haben eine Farm von Tieren. Dann könnte eine Sammlung aller Tiere als
definiert werden %Vor%Dann könntest du über alle Tiere iterieren und sie alle von
essen lassen %Vor%Sie sind auch wichtig für Design Patterns. Ich empfehle Ihnen, über sie Ссылка
zu lesenStellen Sie sich vor, Sie haben die Klasse Tier und drei Implementierungen: Pferd, Kuh und Schwein. Und dann hast du ein Feld, auf dem sie laufen. So können Sie Folgendes machen:
%Vor%Also, hier im Zyklus macht es dir nichts aus, was für ein Tier du hast: Es kann ein Schwein oder eine Kuh sein, oder die ganze Liste kann nur mit Pferden gefüllt werden. Aber sie sind alle Tiere und sie können alle essen. Der Polymorphismus ist hier großartig, denn unabhängig davon, welches Tier Sie haben, wird die Methode essen in Abhängigkeit vom konkreten Objekt gewählt.
Wenn Sie nur eine Unterklasse haben, können Sie die Vorteile nicht explizit sehen, aber nehmen Sie an, Sie haben auch eine zweite namens Lion:
%Vor%Und jetzt haben Sie eine Liste von Tieren, die Sie einfach tun können, und es wird gedruckt, um zu korrigieren essen:
%Vor%Einfach ...
Stellen Sie sich vor, Sie haben mehrere Klassen, in denen Sie Tiere ausstrecken (wie Pferd, Hund, Katze, Ente) und alle Ihre Tierobjekte in eine Liste aufnehmen, dann können Sie sie alle auf einmal füttern
%Vor%und alle werden gefüttert, ohne herausfinden zu müssen, welche Art von Tier gefüttert werden muss. OK. Ihre Tier-verlängernden Klassen müssten sicherstellen, dass sie das richtige Zeug essen, aber das ist der Punkt.
Bei Polymorphie handelt es sich um Objekte, die eine gemeinsame Basis haben, aber unterschiedliche Dinge tun. Stellen Sie sich zum Beispiel vor, ein Schachprogramm zu erstellen. Es wäre wirklich schön, wenn du eine Sammlung von Pieces verwalten könntest. Du musst nicht wissen, dass die Figuren Bauern, Ritter, König, Königin usw. sind. Du musst nur bestimmte Dinge über das Stück wissen. Das Stück könnte Methoden haben, seinen Punktwert zu bestimmen, zu bestimmen, welche Räume gültig sind, um sich zu bewegen, wenn man ein Brett aus anderen Teilen hat, usw. ...
Du könntest auch ein Tetris-Spiel machen. Wenn Sie neue Teile vom oberen Bildschirmrand hinzufügen, wird der Code viel wiederverwendbarer, um alle Teile gleich zu behandeln, aber unterschiedliche Verhaltensweisen (Drehung um einen Block und Drehung um eine Linie sind sehr unterschiedlich).
Hoffentlich hilft Ihnen das, die Praktikabilität zu sehen. Ich weiß, dass dies nur Spielbeispiele sind, aber ich denke, dass sie den Punkt gut veranschaulichen.
In Tier a = neues Pferd (); a.eat () case a kann nicht eine pferdespezifische Methode aufrufen wie in Pferd b = new Horse (); schlagen(); b kann anrufen.
Pferdespezifisch bedeutet die Methode im Pferd, aber nicht im Tier.
Da es sich um eine Referenz von Animal handelt, kennt es nicht die Methoden, die für Pferd angegeben sind.
Und mehr über einen Code wie Animal a = new Horse (); wird nicht von dieser Bedeutung sein, da Sie die Instanz statisch zuweisen. Polymorphismus ist nützlicher in Fällen, in denen Sie nicht wissen, welche Unterklasseninstanz Sie in Runtime haben werden.
Tags und Links java