Java中为什么匿名对象中方法,调用局部变量必须加final呢?

先上代码
public class Mytest1 {
    static List a1 = new ArrayList();


    public static void main(String[] args) {
        final List a2 = new ArrayList();
        Thread b = new Thread() {
            @Override
            public void run() {
                System.out.printf("a1=" + a1);
                System.out.printf("a2=" + a2);
            }
        };
    }
}


这段代码是可以编译通过的,a1为类变量,a2为方法变量(局部变量),但是a2变量必须要加final关键字修饰,这是为什么呢?


这和变量的生命周期有关的,main方法执行完成后,局部变量a2将会被回收,a2也就不存在了,而你在匿名内部对象中却还要使用这个变量,显然要定义成final。定义成final的目的是增强变量的生存期,使在匿名内部类对象中使用的时候这个变量还存在。
而类变量a1 不会因为main方法执行结束而被回收,所以a1不用加final修饰。




备注:上例中使用的匿名对象是Thread,其实任何一个匿名对象如果想访问局部变量a2,均需要定义为final变量
public class Mytest1 {
    static List a1 = new ArrayList();


    public static void main(String[] args) {
        final List a2 = new ArrayList();
        MyObj obj = new MyObj();
        obj.aa(a1);
        obj.aa(a2);


        new MyObj() {
            @Override
            void aa(List a) {
                super.aa(a);
                System.out.printf("a1=" + a1);
                System.out.printf("a2=" + a2);
            }
        };
    }
}
class MyObj {
    void aa(List a) {
        System.out.printf("a=" + a);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值