このように思います
+----------------+
| 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
基本的にはオブジェクト(* the **オブジェクト。変数内を移動できるまったく同じオブジェクト)、インスタンス化されたクラスのインスタンス、データドメイン内のプレーン変数です。super
これは、実行したいコードの借用ブロックへのポインタのようなもので、単なる関数呼び出しのようなものであり、それが呼び出されるクラスに関連しています。
したがってsuper
、スーパークラスから使用する場合、スーパーデュパークラス[祖父母]からコードを取得しますthis
)、スーパークラスから使用する場合(または暗黙的に使用する場合)、サブクラスを指し続けます(誰も変更していないため、たぶん......だろう)。