java – 为什么匿名类访问封闭类的非最终类成员
我们知道只能在匿名类中访问最终的局部变量,这里有一个很好的理由:
Why are only final variables accessible in anonymous class?.
但是,如果变量是封闭类的成员字段,我发现匿名类仍然可以访问非最终变量:How can I access enclosing class instance variables from inside the anonymous class? 我很困惑.我们确保只能在匿名类中访问最终的局部变量,因为我们不希望变量应该在匿名类和本地函数之间失去同步.如果我们尝试在匿名类中访问非最终的封闭类成员,那么同样的原因应该适用于这种情况. 为什么不是一个问题? 解决方法
在局部变量的情况下,变量的副本是匿名类实例接收到的.因此,局部变量必须做到最终,才能在匿名类中使用,这样它的值可能不会在以后更改.
在封闭类的成员字段的情况下,没有副本.相反,匿名类获取对包围类的引用,从而访问外部类的任何/所有成员字段和方法.所以即使这个字段的值发生变化,这个变化也反映在匿名类中,因为它是相同的引用.
如你所见,情况并非如此.复制只适用于局部变量,而不是封闭类的成员字段.原因当然是一个匿名类保留对封闭类的隐含引用,通过该引用,它可以访问任何/所有成员字段&外部类的方法 引用以下链接:
参考文献: Why a non-final “local” variable cannot be used inside an inner class,and instead a non-final field of the enclosing class can?. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 你为什么不能在Java中使用“List>”?
- Java concurrency集合之 CopyOnWriteArrayList_动力节点Jav
- java – @DateTimeFormat无法识别
- 生成若干位数的随机ID的Java工具类
- Java阵列效率
- java – 如何在Spring框架中每隔“N”秒安排一个任务
- Spring + Spring Boot + MyBatis + MongoDB的整合教程
- java – 使用基于Spring MVC注释的控制器和@RequestMapping
- java – 如何配置JComboBox在创建时不选择FIRST元素?
- spring、mybatis 配置方式详解(常用两种方式)