0

我正在尝试运行此代码:

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参数 is not ,因此final不应从匿名类访问它,但代码无法编译。看起来该println行正在尝试使用x参数而不是x字段。为什么?我怎么能告诉它我想要这个x领域?

4

1 回答 1

8

您可以使用

A.this.x

由于匿名Runnable类是类的内部A类。

阴影的概念决定了x

System.out.println(x);

指的是本地方法参数变量x,但这不是final你不能在匿名类中访问它,至少在 Java 7 及更低版本中不能访问它。您可以在 Java 8 中使用,这可能会令人困惑。

不要在同一个编译单元中为变量使用相同的名称。

于 2014-03-28T03:01:03.983 回答