La penso in questo modo
+----------------+
| super |
+----------------+ <-----------------+
| +------------+ | |
| | this | | <-+ |
| +------------+ | | |
| | @method1() | | | |
| | @method2() | | | |
| +------------+ | | |
| method4() | | |
| method5() | | |
+----------------+ | |
We instantiate that class, not that one!
Lasciami spostare quella sottoclasse un po 'a sinistra per rivelare cosa c'è sotto ... (Amico, adoro la grafica ASCII)
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).
In altre parole, citando dalle specifiche del linguaggio Java :
La forma si super.Identifier
riferisce al campo denominato Identifier
dell'oggetto corrente, ma con l'oggetto corrente visto come un'istanza della superclasse della classe corrente.
Il modulo si T.super.Identifier
riferisce al campo denominato Identifier
dell'istanza che racchiude lessicalmente corrispondente a T
, ma con quell'istanza vista come un'istanza della superclasse di T
.
In parole this
povere , è fondamentalmente un oggetto (* l'oggetto **; lo stesso oggetto che puoi spostare nelle variabili), l'istanza della classe istanziata, una semplice variabile nel dominio dei dati; super
è come un puntatore a un blocco di codice preso in prestito che si desidera eseguire, più simile a una semplice chiamata di funzione, ed è relativo alla classe in cui viene chiamato.
Quindi se usi super
dalla superclasse ottieni codice dalla classe superduper [il nonno] eseguita), mentre se usi this
(o se viene usato implicitamente) da una superclasse continua a puntare alla sottoclasse (perché nessuno l'ha cambiata - e nessuno poteva).