Wie ist Super in Java implementiert?

8

Wo ist das "Super" eigentlich definiert? [Wenn wir super.someMethod ()] verwenden. Ist es als ein Feld in der java.lang.Object-Klasse oder der java.lang.Class-Klasse definiert?

Wenn wir von einer Unterklasse aufrufen, enthält super den Verweis auf seine Oberklasse. Auf die gleiche Weise hat der Super in der Oberklasse selbst einen Verweis auf seine Oberklasse [Auf diese Weise bis zu java.lang.Object]. Also, wie Java injiziert die Oberklasse Referenzen auf das Feld "Super", die uns ermöglicht, Superklassen-Methoden aufrufen?

Gibt es unter der Haube Implementierungen wie die folgenden:

%Vor%     
Debadyuti Maiti 23.02.2012, 15:37
quelle

5 Antworten

2

super ist ein spezifisches Objektverweis-Schlüsselwort, das die Objekthierarchie beginnend vom aufrufenden Objekt bis zum Finden eines Vorgängerobjekts mit einer übereinstimmenden Methodensignatur oder Eigenschaft / Feld auffährt. Siehe Java-Dokumentation .

    
Web User 23.02.2012, 15:43
quelle
15

super like this ist ein Schlüsselwort. Es hat in Java eine Bedeutung, die sich nicht im Java-Bytecode widerspiegelt. Es bedeutet die Implementierung meiner Elternklasse (die vererbt werden könnte)

Auf der Byte-Code-Ebene wird die Methode für ihre Elternklasse explizit aufgerufen.

    
Peter Lawrey 23.02.2012 15:42
quelle
2

Es ist kein Feld - es ist ein Sprachschlüsselwort .

Natürlich gibt es einen Verweis auf die Superklasse auf JVM-Ebene, aber auf Java-Ebene können Sie nur über das Schlüsselwort darauf zugreifen. Der Unterschied besteht darin, dass Sie tatsächlich nicht über eine Referenz auf eine Superklassenmethode zugreifen können - dafür wird vom Compiler spezielle Unterstützung benötigt. Und natürlich gibt es kein super.super

    
Michael Borgwardt 23.02.2012 15:44
quelle
1
  

Wird es als ein Feld in der java.lang.Object-Klasse oder der java.lang.Class-Klasse definiert?

Es ist überhaupt kein Feld.

super.someMethod() ist ein Java-Syntaxelement, das "Aufruf der Methode wie in meiner Oberklasse definiert" lautet.

OK, angenommen, dass es hypothetisch ein Feld war. Was wäre sein Typ? Worauf würde es sich beziehen? Wenn es wie folgt erklärt wurde:

%Vor%

dann super.someMethod() würde nicht funktionieren, weil:

  • Class hat keine benutzerdefinierten Methoden und
  • super.someMethod() muss ein Aufruf einer Instanzmethode sein, und wir liefern keine geeignete Instanz.

Andererseits, wenn es wie folgt erklärt wurde:

%Vor%

then super.someMethod() wäre äquivalent zu this.someMethod() und würde die Methode in dieser Klasse aufrufen, nicht das überschriebene.

    
Stephen C 23.02.2012 15:43
quelle
0

Ich schätze, es wird anfangen, die Ahnenkette zu besteigen, bis es die erste Klasse findet, die die Methode hat, die du nach super gestellt hast. Scheint der einfachste Weg. Dies geschieht zur Kompilierzeit, wenn Sie darüber nachdenken. Am Ende ist eine Methode nur ein Funktionszeiger mit einer Aufrufmethode, die die betreffende Instanz akzeptiert (in Ihrem Fall ist es this ). Schau dir die Methode.Invozieren Dokumentation

Er wird vom Compiler mit einer Methodeninstanz aus der Superklasse und dieser als Objektinstanz

verwendet     
gotch4 23.02.2012 15:49
quelle