Diese Frage wurde mir heute in einer Open-Book-Prüfung zum Ende des Moduls gestellt und ich fand mich verloren. Ich las Head first Java
und beide Definitionen schienen genau gleich zu sein. Ich habe mich nur gefragt, was der Hauptunterschied für meine eigene Meinung ist. Ich weiß, dass es eine Reihe ähnlicher Fragen gibt, aber keine, die ich gesehen habe und die eine endgültige Antwort liefern.
java
oop
inheritance
polymorphism
Darren Burgess
quelle
quelle
Antworten:
Vererbung ist, wenn eine 'Klasse' von einer vorhandenen 'Klasse' abgeleitet ist. Wenn Sie also eine
Person
Klasse haben, dann haben Sie eineStudent
Klasse, die erweitertPerson
und alle DingeStudent
erbt ,Person
die vorhanden sind. Es gibt einige Details zu den Zugriffsmodifikatoren, die Sie in die Felder / Methoden in Person eingefügt haben, aber das ist die Grundidee. Wenn Sie beispielsweise ein privates Feld aktiviert habenPerson
,Student
wird es nicht angezeigt, da seine privaten und privaten Felder für Unterklassen nicht sichtbar sind.Polymorphismus befasst sich damit, wie das Programm entscheidet, welche Methoden es verwenden soll, je nachdem, welche Art von Dingen es hat. Wenn Sie eine haben
Person
, die eineread
Methode hat, und Sie eine haben,Student
die erweitertPerson
, die eine eigene Implementierung hatread
, wird die Methode, die aufgerufen wird, von der Laufzeit für Sie bestimmt, je nachdem, ob Sie einePerson
oder eine habenStudent
. Es wird ein bisschen schwierig, aber wenn Sie so etwas tunDie Lesemethode für Student wird aufgerufen. Das ist der Polymorphismus in Aktion. Sie können diese Zuordnung tun , weil ein
Student
aPerson
, aber die Laufzeit ist intelligent genug , um zu wissen , dass sich der tatsächliche Typp
ist Schüler .Beachten Sie, dass sich die Details zwischen den Sprachen unterscheiden. Sie können beispielsweise in Javascript vererben, aber es ist völlig anders als in Java.
quelle
Person
dieread
Methode den Modifikator für den öffentlichen Zugriff verwendet, könnenStudent
Objekte dann nicht darauf zugreifen? undStudent s = new Student();
wird es dann nicht einfacher sein? Ich verstehe die Vorteile des Polymporphismus immer noch nicht ganz.Person p = new Student();
anstelle von verwenden möchtenStudent p = new Student();
?Vererbung bezieht sich auf die Verwendung der Struktur und des Verhaltens einer Superklasse in einer Unterklasse.
Polymorphismus bezieht sich auf das Ändern des Verhaltens einer Superklasse in der Unterklasse.
quelle
m
(beidestatic
undinstance
) der Oberklasse, für die ..." (gefolgt von Details zur Vererbung). Klingt für mich nach "Wiederverwendung von Code".import static
, um diesen Missbrauch von Schnittstellen zu beseitigen.) Für reinen Polymorphismus in Java ist das zu verwendende Tool Schnittstellen, nicht Klassenvererbung.Polymorphismus : Die Fähigkeit, Objekte unterschiedlicher Art auf ähnliche Weise zu behandeln. Beispiel: Giraffe und Krokodil sind beide Tiere, und Tiere können
Move
. Wenn Sie eine Instanz von habenAnimal
, können Sie anrufen,Move
ohne zu wissen oder sich darum zu kümmern, um welche Art von Tier es sich handelt.Vererbung : Dies ist eine Möglichkeit, gleichzeitig Polymorphismus und Code-Wiederverwendung zu erreichen.
Andere Formen des Polymorphismus : Es gibt andere Möglichkeiten, Polymorphismus zu erzielen, z. B. Schnittstellen, die nur Polymorphismus, aber keine Wiederverwendung von Code bieten (manchmal ist der Code ganz anders, z. B.
Move
für eine SchlangeMove
, und in diesem Fall ganz anders als für einen Hund Eine Schnittstelle wäre in diesem Fall die bessere polymorphe Wahl.In anderen dynamischen Sprachen kann Polymorphismus mit Duck Typing erreicht werden. Dies bedeutet, dass die Klassen nicht einmal dieselbe Basisklasse oder Schnittstelle verwenden müssen, sondern nur eine Methode mit demselben Namen. Oder noch dynamischer wie Javascript, Sie brauchen überhaupt keine Klassen, nur ein Objekt mit demselben Methodennamen kann polymorph verwendet werden.
quelle
Der Hauptunterschied besteht darin, dass Polymorphismus ein spezifisches Ergebnis der Vererbung ist. Beim Polymorphismus wird die aufzurufende Methode zur Laufzeit basierend auf dem Objekttyp bestimmt. Dies ist eine Situation, die auftritt, wenn eine Klasse von einer anderen erbt und eine bestimmte Methode überschreibt. In einem normalen Vererbungsbaum müssen Sie jedoch keine Methoden überschreiben, und daher müssen nicht alle Methodenaufrufe polymorph sein. Ist das sinnvoll? Es ist ein ähnliches Problem wie bei allen Ford-Fahrzeugen, bei denen es sich um Automobile handelt, aber nicht bei allen Autos handelt es sich um Fords (obwohl nicht ganz ...).
Darüber hinaus befasst sich der Polymorphismus mit dem Aufruf von Methoden, während die Vererbung auch Datenelemente usw. beschreibt.
quelle
In Java sind die beiden eng miteinander verbunden. Dies liegt daran, dass Java eine Technik zum Aufrufen von Methoden verwendet, die als "dynamischer Versand" bezeichnet wird. Wenn ich habe
Dann sehen wir , dass B erbt
spin
von A. Wenn wir jedoch versuchen , das Objekt zu manipulieren , als ob es sich um eine Typ A waren wir noch für B das Verhalten bekommendraw
. Dasdraw
Verhalten ist polymorph.In einigen Sprachen sind Polymorphismus und Vererbung nicht ganz so eng miteinander verbunden. In C ++ werden beispielsweise Funktionen, die nicht als virtuell deklariert wurden, vererbt, aber nicht dynamisch gesendet, sodass Sie dieses polymorphe Verhalten auch dann nicht erhalten, wenn Sie die Vererbung verwenden.
In Javascript wird jeder Funktionsaufruf dynamisch ausgelöst und Sie haben eine schwache Eingabe. Dies bedeutet, dass Sie eine Reihe von nicht verwandten Objekten haben können, von denen jedes seine eigene hat
draw
, über die eine Funktion iteriert und die Funktion aufgerufen wird, und dass sich jedes Objekt gut verhält. Sie würden Ihre eigene polymorphe Zeichnung haben, ohne Vererbung zu benötigen.quelle
Polymorphismus: Angenommen, Sie arbeiten für ein Unternehmen, das Stifte verkauft. Sie machen also eine sehr schöne Klasse namens "Stift", die alles behandelt, was Sie über einen Stift wissen müssen. Sie schreiben alle Arten von Klassen für die Abrechnung, den Versand und die Erstellung von Rechnungen mit der Pen-Klasse. Ein Tageschef kommt und sagt: "Tolle Neuigkeiten! Das Unternehmen wächst und wir verkaufen jetzt Bücher und CDs!" Keine gute Nachricht, denn jetzt müssen Sie jede Klasse, die Pen verwendet, ändern, um auch Book & CD zu verwenden. Was wäre, wenn Sie ursprünglich eine Schnittstelle namens "SellableProduct" erstellt hätten und Pen diese Schnittstelle implementiert hätte? Dann hätten Sie alle Ihre Klassen für Versand, Rechnungsstellung usw. schreiben können, um diese Schnittstelle anstelle von Stift zu verwenden. Jetzt müssen Sie nur noch eine neue Klasse namens Book & CompactDisc erstellen, die die SellableProduct-Schnittstelle implementiert. Aufgrund des Polymorphismus könnten alle anderen Klassen unverändert weiterarbeiten! Sinn ergeben?
Es bedeutet also, Vererbung zu verwenden, was einer der Wege ist, um Polymorphismus zu erreichen.
Polymorhismus kann in einer Klasse / Schnittstelle möglich sein, aber Vererbung immer zwischen 2 ODER mehr Klassen / Schnittstellen. Vererbung entspricht immer der "ist-eine" -Beziehung, wohingegen es nicht immer dem Polymorphismus entspricht (der beide "ist-eine" / "hat-eine" -Beziehung entsprechen kann.
quelle
Vererbung ist eher eine statische Sache (eine Klasse erweitert eine andere), während Polymorphismus eine dynamische / Laufzeitsache ist (ein Objekt verhält sich gemäß seinem dynamischen / Laufzeittyp und nicht gemäß seinem statischen / Deklarationstyp).
Z.B
-> Obwohl der statische / Deklarationstyp von a A ist, ist der tatsächliche dynamische / Laufzeittyp B und somit führt a.foo () foo wie in B definiert aus, nicht in A.
quelle
Polymorphismus ist ein Ansatz, um gemeinsames Verhalten zwischen Objekttypen mit ähnlichen Merkmalen auszudrücken. Es ermöglicht auch das Erstellen von Variationen dieser Merkmale durch Überschreiben. Vererbung ist ein Weg, um Polymorphismus durch eine Objekthierarchie zu erreichen, in der Objekte Beziehungen und abstraktes Verhalten ausdrücken. Dies ist jedoch nicht der einzige Weg, um Polymorphismus zu erreichen. Der Prototyp ist eine weitere Möglichkeit, Polymorphismus auszudrücken, der sich von der Vererbung unterscheidet. JavaScript ist ein Beispiel für eine Sprache, die einen Prototyp verwendet. Ich würde mir vorstellen, dass es auch andere Möglichkeiten gibt.
quelle
Vererbung ist ein Konzept im Zusammenhang mit der Wiederverwendung von Code. Zum Beispiel, wenn ich eine übergeordnete Klasse sagen lasse
Animal
und sie bestimmte Attribute und Methoden enthält (für dieses Beispiel saymakeNoise()
andsleep()
) und ich zwei untergeordnete Klassen mit dem NamenDog
und erstelleCat
. Da sowohl Hunde als auch Katzen auf dieselbe Weise schlafen gehen (ich würde annehmen), muss dersleep()
Methode in den von der Elternklasse bereitgestellten UnterklassenDog
und nicht mehr Funktionalität hinzugefügt werden . Allerdings bellt und miaut ein so obwohl dasCat
Animal
Dog
Cat
Animal
Klasse könnte eine Methode haben, um ein Geräusch zu machen, ein Hund und eine Katze machen unterschiedliche Geräusche relativ zueinander und zu anderen Tieren. Daher muss dieses Verhalten für die jeweiligen Typen neu definiert werden. Also die Definition von Polymorphismus. Hoffe das hilft.quelle
In der Oracle-Dokumentation wurde der Unterschied genau angegeben.
Vererbung: Eine Klasse erbt Felder und Methoden von allen ihren direkten oder indirekten Oberklassen. Eine Unterklasse kann von ihr geerbte Methoden überschreiben oder von ihr geerbte Felder oder Methoden ausblenden . (Beachten Sie, dass das Ausblenden von Feldern im Allgemeinen eine schlechte Programmierpraxis ist.)
Polymorphismus: Polymorphismus bezieht sich auf ein Prinzip in der Biologie, bei dem ein Organismus oder eine Spezies viele verschiedene Formen oder Stadien haben kann. Dieses Prinzip kann auch auf objektorientierte Programmierung und Sprachen wie die Java-Sprache angewendet werden. Unterklassen einer Klasse können ihr eigenes eindeutiges Verhalten definieren und dennoch einige der gleichen Funktionen der übergeordneten Klasse gemeinsam nutzen.
Polymorphismus ist für Felder nicht anwendbar.
In Verbindung stehender Beitrag:
Polymorphismus vs Überschreiben vs Überladen
quelle
Polymorphismus ist ein Effekt der Vererbung . Dies kann nur in Klassen geschehen, die sich gegenseitig erweitern. Sie können Methoden einer Klasse aufrufen, ohne den genauen Typ der Klasse zu kennen. Polymorphismus tritt auch zur Laufzeit auf .
Beispiel für Java-Polymorphismus:
Durch Vererbung können abgeleitete Klassen Schnittstellen und Code ihrer Basisklassen gemeinsam nutzen. Dies geschieht zur Kompilierungszeit .
Beispielsweise sind alle Klassen in der Java-Plattform Nachkommen des Objekts (mit freundlicher Genehmigung von Oracle):
Erfahren Sie mehr über Java-Vererbung und Java-Polymorphismus
quelle
Vererbung ist, wenn Klasse A alle nicht statisch geschützten / öffentlichen Methoden / Felder von allen ihren Eltern bis zum Objekt erbt.
quelle
Wenn Sie JAVA verwenden, ist dies so einfach:
Polymorphismus verwendet geerbte Methoden, aber "überschreiben" sie, um etwas anderes zu tun (oder dasselbe, wenn Sie Super nennen, wäre technisch gesehen nicht polymorph).
Korrigiere mich, wenn ich falsch liege.
quelle
Der Hauptzweck des Polymorphismus : Um Referenzgröße zu erstellen Superklasse und die Halteunterklasse = object> ein Objekt durchführt mehrere Verhaltensweisen .
In Vererbung , Unterklasse erbt die Eigenschaften der Superklasse .
quelle
Vererbung ist eine Art Polymorphismus. Genau genommen ist Vererbung der dynamische Polymorphismus. Wenn Sie also die Vererbung entfernen, können Sie sie nicht mehr überschreiben.
quelle
Mit Inheritance wird die Implementierung in der Oberklasse definiert - das Verhalten wird also vererbt.
Bei Polymorphism wird die Implementierung in der Unterklasse definiert - daher wird nur die Schnittstelle vererbt.
quelle
Polymorphismus wird durch Vererbung in erreicht
Java
.Hamster
Klasse Erbt Struktur ausAnimal
,Herbivore
undPet
zeigen Polymorphe Behaviorismus eines inländischen Haustier.Cat
Klasse Erbt Struktur ausAnimal
,Carnivore
undPet
zeigen auch Polymorphe Behaviorismus eines inländischen Haustier.quelle