先看一段代码:
public void myRun(final String name){
new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name);
}
}.start();
}
这是一个非常简单的执行线程的函数。
再来看,内部类的生命周期和方法体的生命周期并不相同,如果局部变量不是final类型会出现在这样一个问题。该方法体在1秒内执行完毕,即销毁name变量,那1秒后执行的内部类方法则取不到name变量了。
而局部变量被final修饰之后,此时会在内存中保有一份局部变得的复制品,当内部类访问的时候其实访问的是这个复制品。