Java では、「this」は現在のオブジェクトを指します。「this」は現在のオブジェクトと同じ型であると想定しましたが、次の例を考えてみましょう。
class A {
static void f() {
System.out.println("A.f");
}
void g() {
this.f();
}
}
class B extends A {
static void f() {
System.out.println("B.f");
}
}
public class C {
public static void main(String[] args) {
B test = new B();
h(test);
}
static void h(B x) {
x.g();
}
}
結果は次のとおりです。
A.f.
xg() が呼び出されたとき、x は B 型であるため、わかりません。xg() 呼び出しでは、g が B で検索され、次に A で検索されます (B が A をサブクラス化するため)。次に、g は、A と B の両方のインスタンス メソッドである f を呼び出します。つまり、呼び出される f のバージョンは、暗黙の THIS パラメーターの型に依存します。X は B 型なので Bf() が呼び出されると思いますが、そうではありません。
THIS は正確にはどのような型をとりますか?