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

时间:2015-01-09 08:36:56

标签: java class

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

  

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

一个例子:

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

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

DEMO

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

因为ibaz没有更改,所以{{1}}实际上是最终的。