我正在尝试运行此代码:
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
field 。为什么?我怎样才能告诉它我想要 x
领域?
最佳答案
你可以使用
A.this.x
由于匿名 Runnable
类是 A
类的内部类。
阴影的概念决定了
中的x
System.out.println(x);
指的是本地方法参数变量x
,但这不是final
,因此您无法在匿名类中访问它,而不是在Java 7及以下版本中至少。在 Java 8 中可以,这可能会令人困惑。
不要在同一编译单元中对变量使用相同的名称。
关于java - 从匿名类的角度来看,局部变量遮蔽的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22703363/