Javaこのようなプログラムがあります。
public class LocalScreen {
public void onMake() {
aFuncCall(LocalScreen.this, oneString, twoString);
}
}
LocalScreen.this
はaFuncCall
?を意味しますか?
LocalScreen.this
は、囲んでいるクラスのthis
を指します。
この例はそれを説明する必要があります:
public class LocalScreen {
public void method() {
new Runnable() {
public void run() {
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println(LocalScreen.this.toString());
// Won't compile! 'this' is a Runnable!
//onMake(this);
// Compiles! Refers to enclosing object
onMake(LocalScreen.this);
}
public String toString() {
return "An anonymous Runnable!";
}
}.run();
}
public String toString() { return "A LocalScreen object"; }
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args) {
new LocalScreen().method();
}
}
出力:
An anonymous Runnable!
A LocalScreen object
この投稿は記事として書き直されました here 。
これは、外側のthis
クラスのLocalScreen
インスタンスを意味します。
修飾子なしでthis
を記述すると、呼び出しが内部にある 内部クラス のインスタンスが返されます。
コンパイラーはコードを受け取り、次のようなことを行います。
public class LocalScreen
{
public void method()
{
new LocalScreen$1(this).run;
}
public String toString()
{
return "A LocalScreen object";
}
public void onMake(LocalScreen ls) { /* ... */ }
public static void main(String[] args)
{
new LocalScreen().method();
}
}
class LocalScreen$1
extends Runnable
{
final LocalScreen $this;
LocalScreen$1(LocalScreen $this)
{
this.$this = $this;
}
public void run()
{
// Prints "An anonymous Runnable"
System.out.println(this.toString());
// Prints "A LocalScreen object"
System.out.println($this.toString());
// Won't compile! 'this' is a Runnable!
//onMake(this);
// Compiles! Refers to enclosing object
$this.onMake($this);
}
public String toString()
{
return "An anonymous Runnable!";
}
}
ご覧のとおり、コンパイラが内部クラスを取得すると、それを外部クラスに変換します(これは、内部クラスを理解するためにVMを変更する必要がないように、かなり前に行われた設計上の決定でした)。
非静的内部クラスが作成される場合、外部クラスのメソッド/アクセス変数を呼び出すことができるように、親への参照が必要です。
内部クラスであったものの内部は適切な型ではありません。onMakeメソッドを呼び出すための適切な型を取得するには、外部クラスにアクセスする必要があります。
Class.this
は、外部クラスのインスタンスへのアクセスを許可します。次の例を参照してください。
public class A
{
final String name;
final B b;
A(String name) {
this.name = name;
this.b = new B(name + "-b");
}
class B
{
final String name;
final C c;
B(String name) {
this.name = name;
this.c = new C(name + "-c");
}
class C
{
final String name;
final D d;
C(String name) {
this.name = name;
this.d = new D(name + "-d");
}
class D
{
final String name;
D(String name) {
this.name = name;
}
void printMe()
{
System.out.println("D: " + D.this.name); // `this` of class D
System.out.println("C: " + C.this.name); // `this` of class C
System.out.println("B: " + B.this.name); // `this` of class B
System.out.println("A: " + A.this.name); // `this` of class A
}
}
}
}
static public void main(String ... args)
{
final A a = new A("a");
a.b.c.d.printMe();
}
}
その後、取得します。
D: a-b-c-d
C: a-b-c
B: a-b
A: a