Java匿名内部类访问外部变量,为何需被标志为final?
来源:互联网 发布:java构造器和构造函数 编辑:程序博客网 时间:2024/05/22 14:14
对于Java语言中的final使用,大家应该很熟悉,可以修饰类,表示不可继承;可以修饰方法,表示不可被子类重写;可以修饰变量,表示不可以被二次赋值。那么,Java匿名内部类访问外部变量,为何需被标志为final?这跟上述三个特性有关系吗?
一、问题的提出
Java编程中,使用匿名内部类访问外部方法的局部变量是一件很常见的事件,比如以下代码,使用匿名内部类设置控件的监听器是再常见不过了,下面的例子中,因为匿名监听器类访问了外部局部变量name,编译器提示name变量必须使用final修饰。
为何name变量需被标志为final?这深层次的原因是什么?为什么有这样一个让人摸不着头脑的规定?
二、解释
这要从闭包说起,匿名内部类和外部方法形成了一个闭包,因此,匿名内部类能够访问外部方法的变量,看起来是一种“天经地义”的事情,Java语言当然也需要实现这种特性,但是这里遇到了一个问题。
匿名内部类的生命周期可能比外部的类要长,因此访问外部局部变量有可能是访问不到的。
那怎么办呢?Java语言为了实现这种特性, 只好将外部的局部变量偷偷的赋值了一份给匿名内部类。那这样匿名内部类就可以肆无忌惮的访问外部局部变量了。
问题又来了,这种通过赋值的形式有一个缺陷,匿名内部类不可以修改“原来的局部变量”,因为是一份“复制品”,修改复制品对原变量没什么影响啊。
那怎么办? Java语言干脆强制要求被匿名内部类访问的外部局部变量必须是final的,什么意思呢?就是“一刀切”,不让修改了。
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:454297367【长按复制】 我们一起学Java!
- Java匿名内部类访问外部变量,为何需被标志为final?
- Java匿名内部类访问外部变量,为何需被标志为final?
- Java匿名内部类访问外部类局部变量,为何需被标志为final?
- JAVA匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型
- JAVA 方法内部类为何只能访问外部final类型变量
- [Java] 匿名内部类访问外部类的局部变量为什么一定得是final类型
- 匿名内部类访问final局部变量
- Java中匿名内部类 只能访问外部类变量
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- 解析——java匿名内部类使用外部变量时,外部变量必须是final
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- java 为什么匿名内部类和局部内部类只能访问final变量
- java局部内部类和匿名内部类访问局部final变量的剖析
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- 匿名内部类访问外部类中的局部变量必须是final属性
- 匿名内部类访问外部类中的局部变量必须是final属性
- C# .NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)
- netmap源码分析(五)ioctl 注册过程
- Java 方法传参方式: 按值调用
- Hierarchical Configurations
- at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:370) 异常
- Java匿名内部类访问外部变量,为何需被标志为final?
- redis快速入门
- springboot(六):如何优雅的使用mybatis
- Android研发安全1-Activity组件安全(上)
- 伪类和伪元素以及nth-child() 应用
- owncloud 使用webdav
- Java List 循环移动元素
- Android自定义数字密码键盘
- [安卓开发] WebView网页隐藏屏蔽广告元素标签|去除底部广告