在内部 class 中使用非最终局部变量

Usage of a non-final local variable within an inner class

JLS 8.1.3 给出了有关变量的规则,这些变量未在内部 class 中声明但在 class.

中使用

Any local variable, formal parameter, or exception parameter used but not declared in an inner class must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted.

一个例子:

class A{
    void baz(){
        int i = 0;
        class Bar{ int j = i; }
    }

    public static void main(String[] args){
    }
}

DEMO

为什么要编译代码?我们在内部 class 中使用了未在其中声明的非最终局部变量。

i 实际上是最终的,因为它永远不会被修改。正如您自己引用的 JLS,内部 class 可能有效地使用最终变量。

因为 i 实际上是最终的,因为它在 baz 中没有改变。

在方法 baz 中定义的变量 i 实际上是最终的,因为变量 i 的值没有在别处修改。如果你改变它

void baz(){
        int i = 0;
        i = 2;
        class Bar{ int j = i; }
    }

代码将无法编译,因为变量 i 不再是有效的 final,但如果你只是声明变量 i 并在另一行中初始化它,代码将编译,因为变量是有效的 final

  void baz(){
        int i;
        i = 2;
        class Bar{ int j = i; }
    }