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){
}
}
为什么编译代码?我们在内部类中使用了非final的局部变量,该变量在那里没有声明。
答案 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)
因为i
中baz
没有更改,所以{{1}}实际上是最终的。