Java 在内部类中使用非最终局部变量
给出了关于变量的规则,这些变量不是在内部类中声明的,而是在类中使用的 使用的任何局部变量、形式参数或异常参数 未在内部类中声明的必须声明为final或 实际上是最终的(§4.12.4),或者在 尝试使用 例如:Java 在内部类中使用非最终局部变量,java,class,Java,Class,给出了关于变量的规则,这些变量不是在内部类中声明的,而是在类中使用的 使用的任何局部变量、形式参数或异常参数 未在内部类中声明的必须声明为final或 实际上是最终的(§4.12.4),或者在 尝试使用 例如: class A{ void baz(){ int i = 0; class Bar{ int j = i; } } public static void main(String[] args){ } } 为什么要编译代
class A{
void baz(){
int i = 0;
class Bar{ int j = i; }
}
public static void main(String[] args){
}
}
为什么要编译代码?我们在内部类中使用了非最终局部变量,该类中没有声明
i
实际上是最终版本,因为它从未被修改过。正如您自己引用的JLS一样,内部类可以有效地使用最终变量。因为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; }
}