从 Java 中的 lambda 表达式引用变量

mal*_*ibu 0 java final anonymous-function

为什么 Java 允许这样做,

class Test {
    boolean a;
    public void test() {
        ...
        object.method(e -> a = true);
    }
}
Run Code Online (Sandbox Code Playgroud)

但不是这个,

class Test {
    public void test() {
        boolean a;
        ...
        object.method(e -> a = true);
    }
}
Run Code Online (Sandbox Code Playgroud)

对于第二个示例,它抛出: local variables referenced from a lambda expression must be final or effectively final

第二个例子的唯一区别是变量是在方法内部而不是类本身声明的。我是 Java 编程的初学者,我是否遗漏了一些明显的东西?

And*_*eas 5

第一个例子有效,因为a = true它实际上是 的简写this.a = true,并且this总是final(Java 规范如此说)。

  • @malibu `this.x = y` 正在更改字段 `x` 的值,而不是更改 `this` 引用变量的值。 (2认同)
  • @malibu 请参阅[此答案](/sf/answers/4275308271/)。 (2认同)