Diese Frage wurde mir heute in einer Abschlussprüfung zum offenen Abschluss des Moduls gestellt und fand mich verloren. Ich las Head first Java
und beide Definitionen schienen genau gleich zu sein. Ich habe mich nur gefragt, was der MAIN-Unterschied für meinen eigenen Verstand ist. Ich weiß, dass es eine Reihe ähnlicher Fragen gibt, aber keine, die ich gesehen habe, die eine endgültige Antwort geben.
Vererbung ist, wenn eine "Klasse" von einer vorhandenen "Klasse" abgeleitet wird. Wenn Sie also eine Person
Klasse haben, dann haben Sie eine Student
Klasse, die Person
, Student
erbt all die Dinge, die Person
hat . Es gibt einige Details zu den Zugriffsmodifizierern, die Sie in Person für die Felder/Methoden verwenden. Dies ist jedoch die Grundidee. Wenn Sie beispielsweise ein privates Feld für Person
haben, wird Student
nicht angezeigt, da dessen private und private 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 Person
haben, die eine read
Methode hat, und Sie eine Student
haben, die Person
reicht, die ihre eigene Implementierung von read
hat, die Die Methode wird aufgerufen, hängt von der Laufzeit ab, je nachdem, ob Sie eine Person
oder eine Student
haben. Es wird ein bisschen schwierig, aber wenn Sie so etwas tun
Person p = new Student();
p.read();
die Lesemethode auf Student wird aufgerufen. Das ist der Polymorphismus in Aktion. Sie können diese Zuweisung vornehmen, da eine Student
eine Person
ist, die Laufzeit jedoch intelligent genug ist, um zu wissen, dass der tatsächliche Typ von p
Student ist.
Beachten Sie, dass sich die Details je nach Sprache unterscheiden. Sie können zum Beispiel Vererbung in Javascript durchführen, sie unterscheidet sich jedoch völlig von der Funktionsweise in Java.
Vererbung verweist auf unter Verwendung der Struktur und des Verhaltens einer Superklasse in einer Unterklasse.
Polymorphismus bezieht sich auf das Verhalten einer Superklasse in der Unterklasse ändern.
Polymorphismus : Die Fähigkeit, Objekte unterschiedlichen Typs auf ähnliche Weise zu behandeln. Beispiel: Giraffe und Krokodil sind beide Tiere, und Tiere können Move
sein. Wenn Sie eine Instanz einer Animal
haben, können Sie Move
aufrufen, ohne zu wissen, 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 erreichen, beispielsweise Schnittstellen, die nur Polymorphismus bereitstellen, jedoch keine Wiederverwendung von Code (manchmal ist der Code sehr unterschiedlich, wie zum Beispiel Move
für eine Schlange.) von Move
für einen Hund. In diesem Fall wäre ein Interface die bessere polymorphe Wahl.
In anderen dynamischen Sprachen kann mit Duck Typing Polymorphismus erreicht werden. Die Klassen müssen nicht einmal die gleiche Basisklasse oder Schnittstelle verwenden, sondern nur eine Methode mit demselben Namen. Oder noch dynamischer wie Javascript, Sie brauchen gar keine Klassen, nur ein Objekt mit demselben Methodennamen kann polymorph verwendet werden.
Der Hauptunterschied ist, dass Polymorphismus ein spezifisches Ergebnis der Vererbung ist. Polymorphismus ist der Ort, an dem die aufzurufende Methode zur Laufzeit basierend auf dem Objekttyp bestimmt wird. Dies ist eine Situation, die sich ergibt, wenn eine Klasse von einer anderen Klasse erbt und eine bestimmte Methode überschreibt. In einem normalen Vererbungsbaum müssen Sie jedoch keine Methoden überschreiben. Daher müssen nicht alle Methodenaufrufe polymorph sein. Ist das sinnvoll? Es ist ein ähnliches Problem für alle Ford-Fahrzeuge sind Automobile, aber nicht alle Automobile sind Fords (obwohl nicht ganz ...).
Darüber hinaus behandelt Polymorphismus das Aufrufen von Methoden, während Vererbung auch Datenelemente usw. beschreibt.
In Java sind beide eng miteinander verbunden. Dies liegt daran, dass Java eine Methode für den Methodenaufruf namens "Dynamic Dispatch" verwendet. Wenn ich habe
public class A {
public void draw() { ... }
public void spin() { ... }
}
public class B extends A {
public void draw() { ... }
public void bad() { ... }
}
...
A testObject = new B();
testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A
Dann sehen wir, dass B spin
von A erbt. Wenn wir jedoch versuchen, das Objekt wie einen Typ A zu manipulieren, erhalten wir immer noch das Verhalten von B für draw
. Das draw
-Verhalten ist polymorph.
In einigen Sprachen sind Polymorphismus und Vererbung nicht so eng miteinander verbunden. In C++ zum Beispiel werden Funktionen, die nicht als virtuell deklariert sind, vererbt, jedoch nicht dynamisch abgesetzt, so dass Sie dieses polymorphe Verhalten nicht erhalten, selbst wenn Sie Vererbung verwenden.
In Javascript wird jeder Funktionsaufruf dynamisch abgesetzt und Sie haben schwache Schreibvorgänge. Dies bedeutet, dass Sie eine Reihe nicht zusammenhängender Objekte mit jeweils eigenen draw
haben können, über eine Funktion iterieren und die Funktion aufrufen, und jedes würde sich gut verhalten. Sie hätten Ihren eigenen polymorphen Draw ohne Vererbung.
Polymorphismus: Angenommen, Sie arbeiten für ein Unternehmen, das Stifte verkauft. Sie machen also eine sehr schöne Klasse namens "Pen", die alles behandelt, was Sie über einen Stift wissen müssen. Sie schreiben alle Arten von Klassen für die Abrechnung, den Versand, das Erstellen von Rechnungen und die Verwendung der Pen-Klasse. Ein Tagchef kommt und sagt: "Gute Nachrichten! Das Unternehmen wächst und wir verkaufen jetzt Bücher und CDs!" Keine gute Nachricht, da Sie jetzt jede Klasse, die Pen verwendet, ändern müssen, 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 hat? Dann hätten Sie alle Klassen für Versand, Rechnungsstellung usw. geschrieben, um diese Schnittstelle anstelle von Pen zu verwenden. Jetzt müssen Sie lediglich eine neue Klasse namens Book & CompactDisc erstellen, die die SellableProduct-Schnittstelle implementiert. Aufgrund des Polymorphismus könnten alle anderen Klassen ohne Änderung weiterarbeiten! Sinn ergeben?
Es bedeutet also, Vererbung zu verwenden, eine Möglichkeit, Polymorphie zu erreichen.
Polymorhismus kann in einer Klasse/Schnittstelle möglich sein, aber die Vererbung erfolgt immer zwischen 2 OR mehr Klassen/Schnittstellen. Vererbung entspricht immer einer "is-a" -Beziehung, während es nicht immer mit dem Polymorphismus (der beide "is-a"/"has-a" -Beziehung entsprechen kann, übereinstimmt.
Vererbung ist eher eine statische Sache (eine Klasse erweitert eine andere), während Polymorphismus eine dynamische/Laufzeit-Sache ist (ein Objekt verhält sich entsprechend seinem dynamischen/Laufzeit-Typ und nicht seinem statischen/Deklarationstyp).
Z.B.
// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();
-> Obwohl der statische/Deklarationstyp von a A ist, ist der tatsächliche Dynamik-/Laufzeittyp B und daher führt a.foo () foo wie in B und nicht in A definiert aus.
Die Oracle-Dokumentation zitierte den Unterschied genau.
Vererbung: Eine Klasse erbt Felder und Methoden von allen ihren Oberklassen, ob direkt oder indirekt. Eine Unterklasse kann Methoden, die sie erbt, überschreiben oder Felder oder Methoden verbergen, die sie erbt.. (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 ihre eigenen eindeutigen Verhalten definieren und dennoch einige Funktionen der übergeordneten Klasse gemeinsam nutzen.
Polymorphismus gilt nicht für Felder.
Verwandte Post:
Polymorphismus ist ein Ansatz, um ein gemeinsames Verhalten zwischen Objekttypen mit ähnlichen Merkmalen auszudrücken. Es ermöglicht auch, dass Variationen dieser Merkmale durch Überschreiben erzeugt werden. Vererbung ist ein Weg, um Polymorphismus durch eine Objekthierarchie zu erreichen, in der Objekte Beziehungen und abstraktes Verhalten ausdrücken. Es ist jedoch nicht der einzige Weg, um Polymorphismus zu erreichen. Prototyp ist ein anderer Weg, um Polymorphismus auszudrücken, der sich von Vererbung unterscheidet. JavaScript ist ein Beispiel für eine Sprache, die Prototyp verwendet. Ich könnte mir vorstellen, dass es auch andere Möglichkeiten gibt.
Vererbung ist ein Konzept, das sich auf die Wiederverwendung von Code bezieht. Wenn ich beispielsweise eine übergeordnete Klasse habe, sagen Sie Animal
und diese enthält bestimmte Attribute und Methoden (für dieses Beispiel sagen Sie makeNoise()
und sleep()
), und ich erstelle zwei untergeordnete Klassen mit dem Namen Dog
und Cat
. Da sowohl Hunde als auch Katzen auf dieselbe Weise schlafen gehen (würde ich annehmen), ist es nicht notwendig, die sleep()
-Methode in den von der übergeordneten Klasse Dog
bereitgestellten Unterklassen Cat
und Animal
um weitere Funktionen zu erweitern. Eine Dog
bellt und eine Cat
macht sich jedoch bemerkbar, obwohl die Animal
-Klasse über eine Methode zum Erzeugen von Geräuschen verfügen kann, ein Hund und eine Katze machen jedoch andere Geräusche relativ zueinander und zu anderen Tieren. Daher ist es notwendig, dieses Verhalten für seine spezifischen Typen neu zu definieren. Also die Definition des Polymorphismus. Hoffe das hilft.
Polymorphismus ist ein Effekt von Vererbung . Dies kann nur in Klassen geschehen, die sich gegenseitig erweitern. Sie können damit 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. Es passiert um Kompilierzeit .
Beispiel: Alle Klassen in der Java-Plattform sind Nachkommen von Object (mit freundlicher Genehmigung von Oracle):
Weitere Informationen zu Java-Vererbung und Java-Polymorphismus
vererbung ist eine Art Polymorphismus. Genau genommen ist Vererbung der dynamische Polymorphismus. Wenn Sie die Vererbung entfernen, können Sie sie nicht mehr überschreiben.
Der Hauptzweck von Polymorphism : Zum Erstellen einer Referenzvariablen für die Oberklasse und Halten der Unterklasse object => kann ein Objekt mehrere Verhalten durchführen.
In Vererbung , Unterklasse erben die Eigenschaften der Superklasse .
Vererbung ist, wenn Klasse A alle nicht statisch geschützten/öffentlichen Methoden/Felder von allen ihren übergeordneten Objekten bis Object erbt.
Polymorphismus wird durch Vererbung in Java
erreicht.
public class Animal {}
public interface Herbivore {}
public interface Carnivore {}
public interface Pet {}
public class Hamster extends Animal implements Herbivore implements Pet () {}
public class Cat extends Animal implements Carnivore implements Pet () {}
Die Hamster
-Klasse erbtstructurevon Animal
, Herbivore
und Pet
, umPolymorphes Verhalteneines Haustieres auszustellen.
Die Cat
-Klasse erbtstructurevon Animal
, Carnivore
und Pet
, um auchPolymorphic Behaviorismuseines Haustieres zu zeigen.
Wenn Sie Java verwenden, ist das so einfach:
Polymorphismus verwendet vererbte Methoden, aber "überschreiben" sie, um etwas anderes zu tun (oder das Gleiche, wenn Sie Super nennen, also technisch nicht polymorph sein).
Korrigiere mich, wenn ich falsch liege.