public class InnerCalss {
private String name = "张三";
@Test
public void out(){
String gender = "娜娜";
class Inner{
int in = 1;
public void show(){
System.out.println(name);
System.out.println(gender);
}
}
Inner inner = new Inner();
inner.show();
}
}
对于上面的实例,发现没有任何错误,但是如果再修改gender属性的值,会发现报错

告诉我们,gender已经变成了final类型的数据,不允许被修改,
也就是说局部内部类中的访问外部 类的局部变量的时候,该局部变量必须是final修饰的。
但是,为什么会这样呢?
写一个例子证明这个问题
class Out{
public static void main(String[] args) {
InnerCalss innerCalss = new InnerCalss();
innerCalss.test();
innerCalss.fast.print();
}
}
public class InnerCalss {
public Fast fast = null;
public void test(){
int age = 100;
class Inner implements Fast{
@Override
public void print() {
System.out.println(age);
}
}
fast = new Inner();
}
}
interface Fast{
public void print();
}
局部内部类的生命周期应该在所在方法的执行弹栈而结束的,但是在这个实例中,内部类在方法执行完毕后还被其他引用,所以不会消亡,在这个内部类中引用者局部方法的变量,该变量如果不是final类型的,则会随着方法的消亡而消亡,那么在后期调用内部类方法的时候就找不到该变量,引起异常,所以在这里必须强制性将被调用的局部变量改成final类型
本文探讨了Java中局部内部类使用外部类局部变量时,为何这些变量必须是final的。通过实例说明,当内部类在方法结束后仍被引用,为确保变量状态的一致性,局部变量需作为final,避免方法结束后的引用异常。
505

被折叠的 条评论
为什么被折叠?



