我正在尝试运行此代码:
class A {
int x = 123;
public void f(int x) {
new Runnable() {
public void run() {
System.out.println(x);
}
}.run();
}
static {
A a = new A();
a.f(33);
}
}
但它给了我一个错误:
$ javac A.java && java A
A.java:6: local variable x is accessed from within inner class; needs to be declared final
System.out.println(x);
^
1 error
x
参数不是final
,因此不能从匿名类访问它,但代码无法编译。看起来println
行试图使用x
参数而不是x
字段。为什么?我怎么能告诉它我想要x
字段?
答案 0 :(得分:8)
您可以使用
A.this.x
由于匿名Runnable
类是A
类的内部类。
阴影的概念决定了
中的x
System.out.println(x);
指的是本地方法参数变量x
,但这不是final
,因此您无法在匿名类中访问它,至少在Java 7及更低版本中访问它。你可以在Java 8中使用,这可能会令人困惑。
不要在同一个编译单元中为变量使用相同的名称。