为什么匿名内部类访问的局部变量必须要用final修饰?

这段代码是无法通过编译的。因为匿名内部类访问的局部变量必须要用final修饰

具体原因可以分为两点:

1. 局部变量的生命周期与局部内部类的对象的生命周期不一致

首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而一同被销毁。假设外部类的方法中的变量不定义为final,那么当外部类方法执行完毕的时候,这个局部变量也将被销毁,然而此时内部类的某个方法可能还没有执行完毕,但此时它所引用的外部变量已经被销毁了。如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。

2. 保护数据的一致性

final修饰符对变量来说,深层次的理解就是保障变量值的一致性。因为引用类型变量的本质,是一个引用地址,其还是一个值(可以理解为内存中的地址值)。用final修饰后,这个这个引用变量的地址值不能改变,所以这个引用变量就无法再指向其它对象了。

将数据拷贝完成后,如果不用final修饰,则原先的局部变量是可以发生变化的。假设局部变量发生变化,那么此时匿名内部类是不知道的(因为它只是拷贝了局部变量的值,并不是直接使用了局部变量)。例如说,原先局部变量指向的是对象A,在创建匿名内部类后,匿名内部类中的成员变量也指向A对象。但过了一段时间局部变量的值指向另外一个B对象,但此时匿名内部类中还是指向原先的A对象。那么程序再接着运行下去,可能就会导致程序运行的结果与预期不同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值