因为编译器不允许你在匿名内部类里改变外部类的局部变量,所以要求为final的.
这是因为局部变量的生命周期最多就是他所在方法的生命周期,但是内部类的生命周期有可能比该外部类方法的生命周期还要长
例如:- public class Test {
- public void a() {
- final String aa = "aaa";
- new TestInner(){
- ...
- }.start();
- }
- abstract class TestInner extends Thread{
- public void run() {
- . . .
- }
- }
- }
复制代码 执行完start() 之后方法a 的生命周期就已经结束了,局部变量aa 也跟着结束生命周期了
但是只要线程里的 run 方法没有执行完,内部类TestInner 的生命周期就还没完 |