Я думаю про це так
+----------------+
| super |
+----------------+ <-----------------+
| +------------+ | |
| | this | | <-+ |
| +------------+ | | |
| | @method1() | | | |
| | @method2() | | | |
| +------------+ | | |
| method4() | | |
| method5() | | |
+----------------+ | |
We instantiate that class, not that one!
Дозвольте перенести цей підклас трохи ліворуч, щоб виявити, що знаходиться внизу ... (Людина, я люблю графіку 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).
Іншими словами, цитуючи специфікацію мови Java :
Форма super.Identifier
посилається на поле, назване Identifier
поточним об'єктом, але з поточним об'єктом розглядається як екземпляр надкласу поточного класу.
Форма T.super.Identifier
посилається на поле з ім'ям Identifier
лексично огороджувального екземпляра, що відповідає T
, але з цим екземпляром розглядається як екземпляр надкласу T
.
З точки зору неспеціаліста, this
це в основному об'єкт (* об’єкт **; той самий об’єкт, по якому можна переміщатися в змінних), екземпляр інстанційованого класу, звичайна змінна в області даних; super
це як вказівник на запозичений блок коду, який ви хочете виконати, більше нагадує простий функціональний виклик, і це відносно класу, куди він викликається.
Тому, якщо ви використовуєте super
з суперкласу, ви отримуєте код з класу супердупер [бабуся і дідусь], який виконується), а якщо ви використовуєте this
(або якщо він використовується неявно) з надкласу, він продовжує вказувати на підклас (тому що ніхто його не змінив - і ніхто міг).