局部内部类和匿名内部类访问局部变量的时候,为什么变量要加上final?

首先理解这个问题:内部类能否访问方法里的局部变量?
    答案是可以访问,不过只能读,不能修改; 要想修改,则让内部类自己用另一个变量去拷贝该值,再去修改; 编译器给出的方案是将那个变量修饰为final,原理就是让局部变量不被改变,避免了内部类外面改了变量值而内部类里面也改了变量值的阅读歧义性(因为用户容易忽略内部类对该变量的修改)!
原因:
   内部类对象在方法里创建,正常情况下在方法执行完后会被销毁,方法里的局部变量也会被销毁;
但如果方法的返回值是内部类对象的引用,这个引用被别人持有着,导致方法调用完后内部类对象无法被销毁,而内部类对象又持有方法局部变量的引用, 导致这个局部变量不能被销毁,这是不允许的!

  大家可根据这个例子去理解:

public class LocalVarTest {

    interface Account {
        void print();
    }

    public Account getAccount() {
        int money = 100;

        Account account = new Account(){
            public void print() {
                //这里会修改money的值,会报错!
                //money=money+200;

                //能访问money的值,不过只能读!
                System.out.println("账户存款为:" + money);
            }
        };
        account.print();

        return account;
    }

    public static void main(String[] args) {
        //getAccount方法访问完后,里面的局部变量会消失,但却返回了内部类Account的对象的引用到这里被持有着,导致Account对象不能被销毁,其引用了局部变量money; 这是不允许的!
        Account account = new LocalVarTest().getAccount();
        System.out.println(account);
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值