繁体   English   中英

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

[英]Usage of a non-final local variable within an inner 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){
    }
}

DEMO

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

可变i因为变量i的值不别处改性方法巴兹内部定义是effictively最后。 如果你改变它

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; }
    }

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

因为ibaz没有改变,所以i实际上是最终的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM