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

St.*_*rio 5 java class

JLS 8.1.3为我们提供了关于未在内部类中声明但在类中使用的变量的规则.

使用但未在内部类中声明的任何局部变量,形式参数或异常参数必须声明为final或者是有效的final(§4.12.4),否则在尝试使用时会发生编译时错误.

一个例子:

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

    public static void main(String[] args){
    }
}
Run Code Online (Sandbox Code Playgroud)

DEMO

为什么编译代码?我们在内部类中使用了非final的局部变量,该变量在那里没有声明.

sol*_*4me 2

在方法 baz 中定义的变量i实际上是最终变量,因为变量 i 的值不会在其他地方修改。如果你改变它

void baz(){
        int i = 0;
        i = 2;
        class Bar{ int j = i; }
    }
Run Code Online (Sandbox Code Playgroud)

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

  void baz(){
        int i;
        i = 2;
        class Bar{ int j = i; }
    }
Run Code Online (Sandbox Code Playgroud)