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

标签 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 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/

相关文章:

java - BigDecimal 四舍五入不四舍五入

java - 使用servlet在JSP页面中查看匿名MySQL表

java - 使用 'for' 循环将元素添加到 Java 中的数组列表,其中元素名称的编号递增

java - Java 中的性能密集型字符串拆分和操作

c# - VisualStudio建议在重要的地方删除this-Keyword?

Java 变量阴影方法覆盖概念

C++:不同命名空间中的多个运算符定义

Javascript - 子 block 中的变量重新定义//变量遮蔽

java - 为什么在运行 sonarqube 时需要有效的 HTML 文件作为片段容器?

java - 子类中的成员阴影