使用Java匿名类令人惊讶地访问字段

Ale*_*nde 2 java anonymous-class

我试图更好地理解Java中匿名类的概念.从本网站的其他答案中,我了解到匿名类可以使用包含类的非最终字段OuterClass.this.myField.

我使用接口创建了以下简单的测试用例AnonInt,以及AnonTest带有foo返回实现的匿名类实例的方法的类AnonInt.Dspite我正在使用System.out.println(a)而不是System.out.println(AnonTest.this.a)代码工作并打印正确的结果.怎么会这样?

public interface AnonInt {
    void print();
}

public class AnonTest {

    private int a;

    public AnonTest(int a) {
        this.a = a;
    }

    public AnonInt foo() {
        return new AnonInt() {

            public void print() {
                System.out.println(a);
            }
        };
    }

    public static void main(String[] args) {
        AnonTest at = new AnonTest(37);
        AnonInt ai = at.foo();
        ai.print();
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

尽管我正在使用System.out.println(a)而不是System.out.println(AnonTest.this.a)代码工作并打印正确的结果.怎么会这样?

由于引用a在您的上下文中是明确的,因此这两个表达式引用相同的字段.

通常,AnonTest.this在非常特定的上下文中需要 - 当您的方法需要访问AnonTest对象本身而不是访问其中一个成员时.对于您的程序,这是不必要的:编译器将表达式解析a为对象AnonTest.this.a,并将其传递给System.out.println.