Heim >Java >javaLernprogramm >Java-objektorientierte Vererbung, Polymorphismus, Komposition
Merkmale der Vererbung
Einzelne Vererbung: Jede Unterklasse hat höchstens eine direkte übergeordnete Klasse. Die Anzahl der indirekten übergeordneten Klassen ist nicht begrenzt.
Achten Sie auf das Konzept der übergeordneten Klasse: A-->B-->C-->D, hier ist ABC die übergeordnete Klasse von D, C ist die direkte übergeordnete Klasse von D und AB ist die indirekte übergeordnete Klasse von D
übergeordnete Klassen und Unterklassen haben eine allgemeine und spezielle Beziehung; Unterklassen erweitern übergeordnete Klassen und Unterklassen sind spezielle übergeordnete Klassen
Objekt ist die direkte oder indirekte übergeordnete Klasse aller Klassen ; Wenn beim Definieren einer Klasse die übergeordnete Klasse nicht direkt angegeben wird, wird die Objektklasse standardmäßig geerbt.
Welche Elemente erbt die Unterklasse von der übergeordneten Klasse? erbt nicht die Konstruktionsmethode der übergeordneten Klasse, aber die Konstruktionsmethode der übergeordneten Klasse muss immer aufgerufen werden. Methode
Die Unterklasse erbt die Instanzvariablen und Instanzmethoden, Klassenvariablen und Klassenmethoden der übergeordneten Klasse. Voraussetzung ist natürlich, dass es nicht durch privat geändert wird
Die Mitglieder der übergeordneten Klasse, die privat geändert werden, werden dies nicht tun Methoden, die von Unterklassen geerbt werden
und mit final in geändert werden Die übergeordnete Klasse kann nicht von der Unterklasse überschrieben werden
überschreibt Methoden
Unterklassen und übergeordnete Klassen haben dieselbe Methodensignatur. Dies wird als Unterklasse bezeichnet, die die Methode der übergeordneten Klasse überschreibt
Zwei das Gleiche, zwei kleine, ein großes Prinzip:
Zwei gleiche: Der Methodenname ist derselbe, die formale Parameterliste ist derselbe
Zwei kleine: Der Rückgabewert der Unterklassenmethode ist gleich oder kleiner als die der übergeordneten Klasse; die von der Unterklassenmethode ausgelöste Ausnahme muss gleich oder kleiner als die von der übergeordneten Klasse ausgelöste sein.
Ein wichtiger Punkt: Die Zugriffsrechte der Unterklassenmethode müssen sein Gleich oder größer als die übergeordnete Klasse
statisch: Die Unterklassenmethode muss mit der übergeordneten Klassenmethode konsistent sein, entweder einer Klassenmethode oder einer Instanzmethode, und die beiden dürfen nicht inkonsistent sein
Nach der Methode Beim Umschreiben können Unterklassenobjekte nicht auf die Methoden der übergeordneten Klasse zugreifen, sie können jedoch die Methoden der übergeordneten Klasse in der Unterklassenmethode aufrufen: Super-Instanzmethode, Name der übergeordneten Klasse
Wenn Die Methode der übergeordneten Klasse ist privat. Dann kann die Unterklasse diese Methode nicht überschreiben. Wenn die Unterklasse eine Methode mit derselben Signatur wie die private Methode der übergeordneten Klasse hat, handelt es sich nicht um eine neu hinzugefügte Methode der Unterklasse hat nichts mit der übergeordneten Klasse zu tun
Unterklassenmethoden können mit übergeordneten Klassenmethoden überladen sein
Bei Methoden, die in der übergeordneten Klasse mit „final“ geändert wurden, können Unterklassen das
Super-Schlüsselwort
in der untergeordneten Klasse verwenden Sie das Schlüsselwort super, um Instanzvariablen oder Instanzmethoden der übergeordneten Klasse aufzurufen. super und static können nicht gleichzeitig zum Ändern von Methoden verwendet werden und static können nicht gleichzeitig zum Ändern von Methoden verwendet werden sub Die Klasse erbt eine Variable von der übergeordneten Klasse und definiert eine andere Variable mit demselben Namen. Zu diesem Zeitpunkt können Sie den Variablennamen super verwenden Klassenname. Variablenname für den Zugriff auf die Variable der übergeordneten Klasse VariablensuchsequenzDie Unterklassenmethode greift im Folgenden auf eine Variable zu Reihenfolge: Ob es in der aktuellen Methode eine lokale Variable mit demselben Namen gibtGibt es in der aktuellen Klasse eine Mitgliedsvariable mit demselben Namen? >Super ruft die übergeordnete Klasse auf KonstruktorObwohl die Unterklasse den Konstruktor der übergeordneten Klasse nicht erbt, ruft sie immer den Konstruktor der übergeordneten Klasse auf. Verwenden Sie dies, um den Konstruktor derselben Klasse aufzurufen, und verwenden Sie super, um die übergeordnete Klasse aufzurufen: Die Super-Call-Anweisung wird in die erste Zeile der Konstruktormethode geschrieben, da diese auch geschrieben werden muss in der ersten Zeile, also super und dies wird nicht gleichzeitig angezeigt Indirekter Aufruf: Die erste Zeile der Unterklassenmethode ist dies, und der aufgerufene Konstruktor muss auch den Konstruktor der übergeordneten Klasse aufrufen Impliziter Aufruf: Ohne super oder this ruft das System standardmäßig den parameterlosen Konstruktor der übergeordneten Klasse auf Die Unterklasse erbt die übergeordnete Klasse und ruft den Konstruktor der übergeordneten Klasse immer Ebene für Ebene auf, bis Object wird aufgerufen und die oberste Ebene gefunden. Beginnen Sie nacheinander mit der Ausführung der nächsten Ebene. Beispielsweise der folgende Code, Vererbungsbeziehung: A-->B-->C- ->DAusgabe:
Klasse-A-Konstruktor
B-Klasse-KonstruktorC-Klasse-Konstruktor
D-Klasse-KonstruktorWenn die Die übergeordnete Klasse verfügt nicht über einen Konstruktor ohne Argumente. Die Unterklasse muss den parameterlosen Konstruktor der übergeordneten Klasse aufrufen, sodass sie nicht durchpublic class Test{ public static void main(String[] args) { D d=new D(); } } class D extends C{ D(){ System.out.println("D类构造器"); } }class C extends B{ C(){ System.out.println("C类构造器"); } }class B extends A{ B(){ System.out.println("B类构造器"); } }class A{ A(){ System.out.println("A类构造器"); } }
Polymorphismus
Kompiliert werden kann. Vereinfacht gesagt handelt es sich dabei um Polymorphismus : Erstellen Sie in einem Pyramiden-ähnlichen Vererbungssystem die untere Klasse. Verwenden Sie beim Unterklassifizieren von Objekten den Typ der oberen übergeordneten Klasse, um auf diese unteren Unterklassenobjekte zu verweisen. Wenn dieselbe Methode über denselben Referenzvariablentyp aufgerufen wird, werden unterschiedliche Ergebnisse angezeigt >
Polymorphismus kommt von: Erben des übergeordneten Typs Der Verweis verweist auf das Überschreiben der Objektmethode des Untertyps
Die Referenzvariable hat zwei Typen, einer ist der Kompilierzeittyp und der andere ist die Laufzeit Typ
Upcast: Der übergeordnete Typ verweist auf den Subtyp Object, die Aufwärtstransformation wird vom System automatisch abgeschlossen
Im Fall einer Aufwärtstransformation: Die überschriebene Methode der Unterklasse kann aufgerufen werden Die Referenz des übergeordneten Typs, aber auf Instanzvariablen in der übergeordneten Klasse, die in der Unterklasse nicht verfügbar sind, kann nicht zugegriffen werden. Das heißt, Instanzvariablen weisen keinen Polymorphismus auf
instanceof und erzwungene Typkonvertierung
Basistypen haben eine erzwungene Typkonvertierung, wie zum Beispiel (double)16; Referenztypen haben auch eine erzwungene Typkonvertierung
Zum Beispiel gibt es die folgende Vererbungskette: A-->B-- >C-->D-->E-->F, B b=new D(), in diesem Fall B-Typ verwenden. Zeigt auf das D-Objekt. Zu diesem Zeitpunkt kann die b-Variable konvertiert werden Der ACD-Typ kann jedoch nicht in den EF-Typ konvertiert werden. Es wird eine Ausnahme ClassCastException
ausgelöst.Vor der erzwungenen Typkonvertierung sollte „instanceof“ verwendet werden, um zu bestimmen, ob die Konvertierung durchgeführt werden kann, um das Auslösen von Ausnahmen zu vermeiden
X-Variableninstanz vom Y-Typ: Um zu bestimmen, ob die X-Variable in den Y-Typ konvertiert werden kann, Drei Situationen können auftreten:
true bedeutet, dass es konvertiert werden kann, was bedeutet, dass der Typ des Objekts, auf das die X-Variable zeigt, vom Typ Y oder einem Subtyp von Y ist;
false bedeutet, dass es konvertiert werden kann kann nicht konvertiert werden, was bedeutet, dass der Typ der X-Variablen derselbe ist wie der Y-Typ Eltern-Kind- oder Kind-Eltern-Beziehung vom Typ Y. Beide sind Untertypen des Passes, was darauf hinweist, dass X und Y keine Eltern-Kind- oder Kind-Vater-Vererbungsbeziehung haben
Vererbung und Kombination
Vererbung kann die Wiederverwendung von Code realisieren, zerstört jedoch die Kapselung; Kombination kann auch die Wiederverwendung von Code realisieren
Grundsätze, die beim Entwerfen von übergeordneten Klassen befolgt werden müssen:
Versuchen Sie, private zu verwenden, um die internen Daten der übergeordneten Klassen zu verbergen Klasse und erlauben Sie Unterklassen nicht, direkt auf die Mitgliedsvariablen der übergeordneten Klasse zuzugreifen
Lassen Sie Unterklassen nicht tun, was sie wollen. Auf Methoden der übergeordneten Klasse zugreifen und diese ändern. Die Hilfstool-Methoden der übergeordneten Klasse werden mit „privat“ dekoriert; die Methoden, die nicht von Unterklassen aufgerufen werden sollen, werden mit „final“ dekoriert Umgeschrieben durch Unterklassen werden mit protected geändert
Rufen Sie keine Methoden auf, die von Unterklassen im Konstruktor der übergeordneten Klasse überschrieben werden können, die Folgen sind schwerwiegend
Prinzipien der Designvererbung:
Unterklassen müssen zusätzliche Attribute hinzufügen, keine Eigenschaftenänderungen
Unterklassen müssen ihre eigenen einzigartigen Funktionen oder Verhaltensweisen hinzufügen, Sie können neue Methoden hinzufügen oder übergeordnete Klassenmethoden neu schreiben
Entwerfen Sie keine Vererbung Nur zum Zweck der Wiederverwendung von Code, aber es hängt von der tatsächlichen Situation ab, ob die übergeordnete Klasse und die Unterklasse eine „Hat-eine“-Beziehung haben
Ich möchte nicht, dass eine Klasse vererbt wird:
final: Verwenden Sie final, um die Klasse als letzte Klasse zu ändern, sie kann nicht geerbt werden
private: Ändern Sie alle Konstruktionsmethoden der Klasse mit privat, sodass Unterklassen den Konstruktor der Klasse nicht aufrufen und nicht erben können Darüber hinaus sollte eine statische Methode bereitgestellt werden, um den Konstruktor der Klasse
zurückzugeben. Die Kombination kann auch eine Code-Wiederverwendung erreichen
Klasse A verwendet die Methode von Klasse B
Erstellen Sie ein Objekt der Klasse B in Klasse A und ändern Sie es mit privatem
Rufen Sie die Methode des Objekts der Klasse B in der Methode der Klasse A auf
Kombination oder Vererbung:
Vererbung : Die Unterklasse und die übergeordnete Klasse haben eine „ist-ein“-Beziehung, konkret und abstrakt, speziell Kombination mit der allgemeinen Beziehung
: Die neue Klasse und die alte Klasse haben eine „hat-ein“-Beziehung, die Beziehung zwischen dem Ganzen und dem Teil
Sonstiges:
Für Unterklassen aus der übergeordneten Klasse Beim Erben einer Variablen und Definieren einer Variablen mit demselben Namen wird beim Erstellen eines Unterklassenobjekts Speicher zugewiesen beide Variablen, aber die übergeordnete Klassenvariable ist ausgeblendet