0
 TestClass.this.onError(error);

これはJavaのキーワークだと思いますが、どのようにクラス名をこれに続けることができますか? これはJavaの特別な機能ですか?

4

3 に答える 3

9

これは、内側のクラス内から外側のクラスの暗黙的なインスタンスにアクセスする方法です。例えば:

public class Test {
    
    private final String name;
    
    public Test(String name) {
        this.name = name;
    }
    
    public static void main(String[] args) {
        Test t = new Test("Jon");
        // Create an instance of NamePrinter with a reference to the new instance
        // as the enclosing instance.
        Runnable r = t.new NamePrinter();
        r.run();
    }    
    
    private class NamePrinter implements Runnable {
        @Override public void run() {
            // Use the enclosing instance's name variable
            System.out.println(Test.this.name);
        }
    }
}

内部クラスとそれを囲むインスタンスの詳細については、Java 言語仕様のセクション 8.1.3を参照してください。「修飾された」式については、セクション 15.8.4を参照してください。this

字句的に囲んでいるインスタンス (§8.1.3) は、キーワード this を明示的に修飾することで参照できます。

で示さCれるクラスとしClassNameます。Cnは、修飾された this 式が現れるクラスの n 番目の字句的に囲んでいるクラスであるような整数であるとします。

フォームの式の値は、ClassName.this辞書的にこれを囲んでいる n 番目のインスタンスです。

式の型はC.

于 2012-12-23T13:35:59.023 に答える
1

内部クラスから、それを含む TestClass のインスタンスからインスタント メソッドを呼び出しています。

于 2012-12-23T13:36:19.230 に答える
1

クラスの内部クラスから使用でき、外部クラスを参照します。

たとえば、クラス Cat がある場合

public class Cat {

private int age;
private Tail tail;

public Cat(int age) {
    this.age = age;
    this.tail = new Tail();
}

class Tail {

    public void wave() {
        for(int i = 0; i < Cat.this.age; i++) {
            System.out.println("*wave*");
        }
    }

}

public Tail getTail() {
    return tail;
}

/**
 * @param args
 */
public static void main(String[] args) {
    new Cat(10).getTail().wave();
}

}
于 2012-12-23T13:36:22.683 に答える