为什么局部内部类与匿名内部类只能访问final修饰的局部变量

文章讨论了Java中局部内部类或匿名内部类如何处理非final引用类型的局部变量副本,强调了在方法结束栈空间释放后可能引发的问题。Java设计者规定只能访问final或effectivelyfinal修饰的局部变量以防止这种访问已销毁数据的情况。
摘要由CSDN通过智能技术生成

    前提:----局部内部类或匿名内部类调用了它们所在的方法中的局部变量----,在初始化这些类时,会创建一块空间来存放这个局部变量的副本 (这个副本呢可以说是copy原有的变量得来的,具有原有变量的所有性质) 这里可以看作是方法传参的方式。对于一般数据类型而言,只是值传递,没有什么问题。

    但是对于引用类型而言问题可就大了。要知道java中,销毁一个对象需要具有一定的条件,所以说,这些类的生命周期是可以比它们所属的方法要长的。当这个方法调用结束后,相关的栈空间会被释放,那个局部变量也会被销毁。

     问题来了!如果局部内部类或匿名内部类中的那个副本是引用类型的话 ,且被类使用过程中指向没有改变的话。这些类就可能会在后续的访问这个副本的过程中导致-----访问了一个不存在的数据(已经被销毁了)。

      所以为了防止这个问题,Java设计者设计为:局部内部类与匿名内部类只能访问final修饰的局部变量或effectively final修饰的局部变量(在Java 8及之后的版本中,如果局部变量被隐式赋予了"effectively final"的特性(即在初始化后未再修改它的值),则可以省略将其显式声明为final。这是因为编译器会自动为那些满足"effectively final"特性的局部变量添加final修饰符)。因为final所修饰的引用类型,不能改变所指向的内容,所以这个存放在内存中的内容是不会被销毁的。

注意一点是:(不同于其它副本,局部内部类与匿名内部类中的局部变量的副本不会随局部变量的销毁而销毁)

不正确,欢迎指出!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值