原因
在方法中的内部类访问方法内的局部变量时,jdk8之前必须使用final。反编译后看出,内部类实际上也会生成一个有构造方法的类,引用的变量作为参数传递了进来,包括外部类实例(这也是为什么内部类默认会持有外部对象的引用,容易造成内存泄漏),然后赋值给了自己的变量,也就是说如果在内部类里面改变外部变量的值,实际上改变的只是内部类自己的变量值,并非外部变量的值,就像方法传变量过来一样,无法在方法里面改变他的值导致外部变量改变,方法里面的变量都是局部的。所以为了防止这种不一致出现,必须为final。