看下面的例子:
package com.xs.localinnerclass;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
final User user = new User();
System.out.println(user);
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(user);
}
}).start();
}
}
class User {
}
输出:
com.xs.localinnerclass.User@7150bd4d
com.xs.localinnerclass.User@7150bd4d
user是一个局部变量,当main方法执行完后应该就消亡了,为什么在新启线程中两秒后还能在Runnable.run()方法中访问该变量呢?
一种可能是在编译期,将该变量(引用)的副本保存到了内部类中。
从输出结果可以看出,局部变量引用和内部类成员变量引用指向了同一个对象。
为什么要将内部类引用的局部变量声明为final呢?那是因为如果在方法中(或者内部类中)重新给该变量赋值,或者将该变量的引用指向新的对象,那么局部变量与内部类中的副本将不能同步,会产生莫名其妙的情况。