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)
为什么编译代码?我们在内部类中使用了非final的局部变量,该变量在那里没有声明.
在方法 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)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |