Bu şekilde düşünüyorum
+----------------+
| super |
+----------------+ <-----------------+
| +------------+ | |
| | this | | <-+ |
| +------------+ | | |
| | @method1() | | | |
| | @method2() | | | |
| +------------+ | | |
| method4() | | |
| method5() | | |
+----------------+ | |
We instantiate that class, not that one!
Alt sınıfı biraz sola kaydırıp, altında ne olduğunu ortaya çıkarayım ... (Adamım, ASCII grafiklerini seviyorum)
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).
Başka bir deyişle, Java Dil Spesifikasyonundan alıntı yapmak :
Form , geçerli nesnenin super.Identifier
adlandırılmış Identifier
, ancak geçerli nesnenin geçerli sınıfın üst sınıfının bir örneği olarak görüldüğü alana başvurur.
Form T.super.Identifier
, Identifier
karşılık gelen sözcüksel olarak çevreleyen örneğe karşılık gelen T
, ancak bu örnek üst sınıfının bir örneği olarak görülen alana başvurur T
.
Layman'ın terimleriyle, this
temelde bir nesnedir (* ** nesne; değişkenler içinde hareket ettirebileceğiniz aynı nesne), başlatılan sınıfın örneği, veri alanında düz bir değişkendir; super
çalıştırılmasını istediğiniz ödünç alınmış bir kod bloğunun işaretçisi gibidir, daha çok bir işlev çağrısı gibidir ve çağrıldığı sınıfa göre değişir.
Bu nedenle super
, süper sınıftan kullanırsanız , süper sınıftan [büyükbaba] çalıştırılan) kod alırsınız, ancak bir üst sınıftan kullanırsanız this
(veya örtük olarak kullanılıyorsa) alt sınıfa işaret etmeye devam eder (çünkü onu kimse değiştirmedi - ve hiç kimse abilir).