Ich denke so
+----------------+
| super |
+----------------+ <-----------------+
| +------------+ | |
| | this | | <-+ |
| +------------+ | | |
| | @method1() | | | |
| | @method2() | | | |
| +------------+ | | |
| method4() | | |
| method5() | | |
+----------------+ | |
We instantiate that class, not that one!
Lassen Sie mich diese Unterklasse ein wenig nach links verschieben, um zu zeigen, was sich darunter befindet ... (Mann, ich liebe ASCII-Grafiken)
We are here
|
/ +----------------+
| | super |
v +----------------+
+------------+ |
| this | |
+------------+ |
| @method1() | method1() |
| @method2() | method2() |
+------------+ method3() |
| method4() |
| method5() |
+----------------+
Then we call the method
over here...
| +----------------+
_____/ | super |
/ +----------------+
| +------------+ | bar() |
| | this | | foo() |
| +------------+ | method0() |
+-> | @method1() |--->| method1() | <------------------------------+
| @method2() | ^ | method2() | |
+------------+ | | method3() | |
| | method4() | |
| | method5() | |
| +----------------+ |
\______________________________________ |
\ |
| |
...which calls super, thus calling the super's method1() here, so that that
method (the overidden one) is executed instead[of the overriding one].
Keep in mind that, in the inheritance hierarchy, since the instantiated
class is the sub one, for methods called via super.something() everything
is the same except for one thing (two, actually): "this" means "the only
this we have" (a pointer to the class we have instantiated, the
subclass), even when java syntax allows us to omit "this" (most of the
time); "super", though, is polymorphism-aware and always refers to the
superclass of the class (instantiated or not) that we're actually
executing code from ("this" is about objects [and can't be used in a
static context], super is about classes).
Mit anderen Worten, zitiert aus der Java-Sprachspezifikation :
Das Formular super.Identifier
bezieht sich auf das Feld mit dem Namen Identifier
des aktuellen Objekts, wobei das aktuelle Objekt jedoch als Instanz der Oberklasse der aktuellen Klasse angesehen wird.
Das Formular T.super.Identifier
bezieht sich auf das Feld Identifier
der lexikalisch einschließenden Instanz, die dieser Instanz entspricht T
, jedoch als Instanz der Oberklasse von angesehen wird T
.
Für Laien this
ist es im Grunde ein Objekt (* das ** Objekt; dasselbe Objekt, das Sie in Variablen verschieben können), die Instanz der instanziierten Klasse, eine einfache Variable in der Datendomäne; super
ist wie ein Zeiger auf einen geliehenen Codeblock, den Sie ausführen möchten, eher wie ein bloßer Funktionsaufruf, und er ist relativ zu der Klasse, in der er aufgerufen wird.
Wenn Sie also super
aus der Oberklasse verwenden, erhalten Sie Code von der Superduper-Klasse [dem Großelternteil], der ausgeführt wird. Wenn Sie this
eine Oberklasse verwenden (oder implizit verwenden), zeigt sie weiterhin auf die Unterklasse (weil niemand sie geändert hat - und niemand könnten).