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类型