从匿名类的角度看,字段由局部变量遮蔽

时间:2014-03-28 02:59:46

标签: java shadowing

我正在尝试运行此代码:

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字段?

1 个答案:

答案 0 :(得分:8)

您可以使用

A.this.x

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

阴影的概念决定了

中的x
System.out.println(x);

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

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