我试图更好地理解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();
}
}
答案 0 :(得分:5)
尽管我使用
System.out.println(a)
而不是System.out.println(AnonTest.this.a)
,但代码仍可正常运行并打印出正确的结果。怎么会这样?
由于对a
的引用在您的上下文中是明确的,因此这两个表达式引用相同的字段。
通常,在非常特定的上下文中需要AnonTest.this
- 当您的方法需要访问AnonTest
对象本身而不是访问其中一个成员时。对于您的程序,这是不必要的:编译器将表达式a
解析为对象AnonTest.this.a
,并将其传递给System.out.println
。