这是因为局部内部类和匿名内部类 和 方法的生命周期不一致造成的,方法的生命周期结束后局部变量就会被销毁。但是此时局部内部类和匿名内部类还没有完成任务,所以局部变量还不能销毁,否则会造成空指针。
# 最经典的匿名内部类,比如线程Runnable接口
void doThing(){//外部方法
final Integer a = 100;
new Thread(new Runnable() {//异步的
@Override
public void run() {
System.out.println(a);
Thread.sleep(100 * 1000);//内部方法不会结束
}
}).start();
}
为了解决这个问题,局部内部类和匿名内部类就将方法传过来的复制拷贝了一份放入自己的内部变量,但是复制了之后就无法保证字面量或者引用值一样,java就采用了这样的妥协机制,使用final修饰防止局部变量被修改。