偶然间想到一个问题,Java匿名内部类里为什么能用外部变量?Java到底在背后做了什么呢:
final List<Integer> list = new ArrayList<>();
new Thread(new Runnable() {
@Override
public void run() {
Thread.sleep(100000);
System.out.println(list.size());
}
}).start();
按理说,线程睡了100s,方法早就反回了,但还能打印出size。其实Java为了方便开发者,总是在背后默默的付出。
编译后会有一个很奇怪的字节码文件,把它反编译,就会发现这个匿名的内部类不再匿名,实例化时,变量list被当做参数传到构造方法里。final修饰list则是保证这个list不会被再次赋值,否则不符合常理。