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

时间:2016-09-07 16:39:41

标签: java anonymous-class

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

我使用接口AnonInt和类AnonTest使用方法foo进行了以下简单测试用例,该方法返回实现AnonInt的匿名类的实例。说明我使用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();
    }
}

1 个答案:

答案 0 :(得分:5)

  

尽管我使用System.out.println(a)而不是System.out.println(AnonTest.this.a),但代码仍可正常运行并打印出正确的结果。怎么会这样?

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

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