Wir haben nächste Klassen:
%Vor%Ausgabe ist:
Super
Sub
Was ist super
vorhanden? Ist es ein Objekt der Elternklasse, welches Kind als Feld behält?
Ich habe versucht, Google, aber alles, was ich gefunden habe, ist gemeinsame Informationen darüber, wie Klassen erben und so weiter.
Sie sagen mir immer noch offensichtliche Dinge. Vielleicht war meine Frage wenig irreführend, aber ich werde versuchen, sie umzuformulieren:
super
aufrufen, sagen Sie, wir greifen auf die Methode des Elternteils zu. Aber wie können wir diese Methode ohne das Objekt der Eltern benennen? super
gleich wie this
? this
ist eine Referenz auf ein konkretes Objekt, wie Sie wissen. Die untergeordnete Klasse verwaltet kein spezielles Feld, das das übergeordnete Element darstellt. Vielleicht denken Sie etwas in Richtung innerer Klassen, die tun einen Verweis auf ihre äußere Klasse beibehalten. Dies ist ein Spezialfall und repräsentiert nicht, wie Super-Sub-Klassen miteinander in Beziehung stehen.
Intern unterhält die JVM eine "Methodentabelle", die jede Klasse mit den für diese Klasse verfügbaren Methoden verknüpft. Die JVM kennt auch die Beziehungen zwischen allen geladenen Klassen, einschließlich Super-Sub-Beziehungen.
Wenn Sie eine super
-Funktion aufrufen, macht die JVM tatsächlich ein paar Dinge:
invokespecial
) Wenn Sie die Klassendatei für Ihre Klasse Sub
untersuchen würden, würden Sie für die Methode foo
Folgendes sehen:
Zeile 1 in der Liste zeigt die spezielle Anweisung, die die Superklassenmethode aufruft.
Eine gute Quelle zum Lesen wäre die Java Virtual Machine-Spezifikation , besonders Abschnitt 2.11.8 .
Okay. Lass uns Zeile für Zeile durch deinen Code gehen.
Ihre erste Aussage in Ihrer 'foo' Methode ist
%Vor% Nun, das ist ein expliziter Aufruf der Superklasse foo
method. Was ist:
So wird "Super" an die Konsole ausgegeben, weil Sie diese Methode explizit mit dem Schlüsselwort super
aufgerufen haben. super
bezieht sich auf die Superklasse der Klasse, genauso wie this
sich auf die aktuelle Klasse bezieht.
Weiter ist der Rest der Methode foo
in der Unterklasse:
Nun, nachdem super.foo()
aufgerufen wurde, ist es Zeit, zur nächsten Anweisung zu gehen, die "Sub" ausgibt.
Der Grund, warum Ihr Programm zuerst in die Methode der Unterklasse anstatt in die Oberklasse übergeht, liegt an dem Prinzip Polymorphism
. Das heißt, eine Unterklasse übernimmt eine Methode aus der Oberklasse und ändert ihr Verhalten.
Abstrakte Klassen
Sie können keine Instanzen von abstrakten Klassen erstellen, nein, aber mit dem Schlüsselwort super
können Sie dennoch auf die Funktionen der Superklasse zugreifen.
Im Kontext der Java Virtual Machine
Was passiert also, wenn die Java Virtual Machine bei einem Methodenaufruf nach der Methode in der lokalen Klasse sucht, wenn es sich um eine Instanzmethode handelt. Wenn es nicht gefunden werden kann, wird es in die Oberklasse verschoben. Wenn Sie das Prinzip Polymorphism
verwenden, findet die JVM die Methode mit der korrekten Signatur in der Unterklasse und hört auf zu suchen. So funktioniert Vererbung und Polymorphism
im Kontext von Java in einfachen Worten.
Wenn Sie eine Methode überschreiben, fügen Sie der Unterklassendefinition eine Methode mit derselben Methodensignatur (Name, Nummer und Typ der Felder einer Methode) hinzu. So findet die JVM das, und hier wird die überschriebene Methode gespeichert.
super
ist ein Schlüsselwort, mit dem Sie die in der Oberklasse definierte Methodenimplementierung aufrufen können. Es ist kein Feld Ihrer Unterklasse.
Wenn dies nicht der Fall ist, wo ist die überarbeitete Methode zu halten?
Ich bin nicht ganz sicher, was Sie damit meinen, aber:
Da Sub
erweitert Super
ist, enthält die Definition der Klasse Sub
einen Verweis auf die Definition der Klasse Super
.
Beantworten aktualisierter Fragen:
Wenn wir Methode mit Super aufrufen, sagen Sie, dass wir die Methode der Eltern anwenden. Aber wie können wir diese Methode ohne Elternobjekt nennen?
Eine Methode ist nur ein Block von Code, nur eine Folge von Bytecode-Anweisungen, die wir ausführen müssen. Wenn Sie eine Methode aufrufen, besteht die Aufgabe der JVM darin, anhand des angegebenen Methodennamens und der Parameter festzustellen, wo dieser Codeblock zu finden ist. Normalerweise wird, wie andere bereits gesagt haben, zuerst in der Klassendefinition der Klasse des Objekts gesucht, auf dem die Methode aufgerufen wurde. Wenn Sie super
verwenden, weisen Sie die JVM an, nicht hier zu suchen und stattdessen in die Definition der Elternklasse zu schauen.
Sie brauchen also keine separaten Instanzen von Super
und Sub
, weil ein Sub
ist ein Super
( new Sub() instanceof Super
ist true
), und weil der JVM weiß, dass das Schlüsselwort super
bedeutet, dass es nach dem Code suchen soll, der eine Methode in der Klassendefinition von Super
erstellt.
Ist das super gleich? Dies ist ein Verweis auf konkrete Objekte, wie Sie wissen.
Nein, sie sind nicht gleich. this
ist ein Verweis auf das aktuelle Objekt, während super
kein Verweis auf ein Objekt ist, sondern ein Schlüsselwort, das beeinflusst, wo die JVM nach dem Code sucht, der eine Methode definiert, die aufgerufen wird.
Wenn Sie super.foo();
schreiben, rufen Sie die Superklassenmethode auf.
Die foo-Methode von class sub überschreibt die foo-Methode von Super, indem eine Anweisung zur super-class-Methode hinzugefügt wird.
Es gibt nur ein Objekt, das gleichzeitig ein Sub, ein Super und ein Objekt ist. Es enthält alle nicht statischen Felder für jede dieser Klassen. Eine Klasse benötigt nur eine Kopie des Codes für ihre Methoden, selbst die nicht-statischen.
Tags und Links java inheritance