class Outer
{
void m1()
{
int a=12;
class Inner
{
void show()
{
System.out.println(a);
}
}
new Inner().show();
}
}
在这里,当我编译此代码时,我收到错误,即局部变量 a 是从内部类中访问的;需要宣布最终。但这里的“int a”是一个局部变量,所以为什么我们需要声明为final才能在内部类中访问。
需要声明局部变量final
如果它用在内部类中。对于要在此类内部类中使用的局部变量,Java 在后台获取局部变量的副本并将其放入隐式实例变量中,以便内部类可以访问它。因为它是副本,所以如果值发生更改,副本可能会出错。所以编译器强制你这样做final
.
请注意,在 Java 8 中,这可以编译,因为a
是“有效最终的”——未声明final
,但一旦初始化就不会改变。
JLS 第 8.1.3 节 http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.3 states:
任何使用但未在内部类中声明的局部变量、形式参数或异常参数都必须声明为 Final 或实际上为 Final(第 4.12.4 节),否则在尝试使用时会发生编译时错误。
JLS 第 4.12.4 节 http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4 states:
如果局部变量或方法、构造函数、lambda 或异常参数未声明为 Final,则它实际上是 Final,但它绝不会作为赋值运算符 (第 15.26 节) 的左操作数或作为前缀或后缀增量的操作数出现或减运算符(§15.14、§15.15)。
此外,如果满足以下所有条件,则声明缺少初始值设定项的局部变量实际上是最终变量:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)