Lo pienso de esta manera
+----------------+
| super |
+----------------+ <-----------------+
| +------------+ | |
| | this | | <-+ |
| +------------+ | | |
| | @method1() | | | |
| | @method2() | | | |
| +------------+ | | |
| method4() | | |
| method5() | | |
+----------------+ | |
We instantiate that class, not that one!
Déjame mover esa subclase un poco hacia la izquierda para revelar lo que hay debajo ... (Hombre, me encantan los gráficos 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).
En otras palabras, citando la especificación del lenguaje Java :
El formulario se super.Identifier
refiere al campo denominadoIdentifier
del objeto actual, pero con el objeto actual visto como una instancia de la superclase de la clase actual.
La forma se T.super.Identifier
refiere al campo nombrado Identifier
de la instancia que encierra léxicamente correspondiente a T
, pero con esa instancia vista como una instancia de la superclase de T
.
En términos this
sencillos , es básicamente un objeto (* el ** objeto; el mismo objeto que se puede mover en variables), la instancia de la clase instanciada, una variable simple en el dominio de datos; super
es como un puntero a un bloque de código prestado que desea que se ejecute, más como una mera llamada a función, y es relativo a la clase donde se llama.
Por lo tanto, si usa super
de la superclase, obtiene código de la clase superduper [el abuelo] ejecutado), mientras que si usa this
(o si se usa implícitamente) de una superclase, sigue apuntando a la subclase (porque nadie lo ha cambiado, y nadie podría).