为什么在匿名内部类中引用外部对象要加final修饰符
2024-09-19 08:29:50
当所在的方法的形参需要被内部类里面使用时,该形参必须为final。
为什么必须要为final呢?
首先我们知道在内部类编译成功后,它会产生一个class文件,该class文件与外部类并不是同一class文件,仅仅只保留对外部类的引用。当外部类传入的参数需要被内部类调用时,从java程序的角度来看是直接被调用:
public class OuterClass {
public void display(final String name,String age){
class InnerClass{
void display(){
System.out.println(name);
}
}
}
}
从上面代码中看好像name参数应该是被内部类直接调用?其实不然,在java编译之后实际的操作如下:
public class OuterClass$InnerClass {
public InnerClass(String name,String age){
this.InnerClass$name = name;
this.InnerClass$age = age;
} public void display(){
System.out.println(this.InnerClass$name + "----" + this.InnerClass$age );
}
}
简单理解就是,拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。
故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。
发现jdk1.8必须加final,jdk13又不用加final,java语法糖会在底层自动加上,网络搜索得到1.9开始默认加上final。
最新文章
- RAID磁盘阵列的搭建(以raid0、raid1、raid5、raid10为例)
- 关于图像文章垂直无缝连接滚动——JS实现
- mysql查询所有记录,并去掉重复的记录
- Java NIO示例:多人网络聊天室
- 在Unity中使用贝塞尔曲线(转)
- 剑指 offer set 6 打印从 1 到 N 的所有数
- lintcode:anagrams 乱序字符串
- linux查看硬件环境
- 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治
- mahout算法源码分析之Itembased Collaborative Filtering(二)RowSimilarityJob
- mysql2redis
- VC Windows系统服务创建代码
- 论文翻译:Neural Networks With Few Multiplications
- Python3.x在linux下print中文问题
- 【原创】python嗅探QQ消息实战
- easyUI tab页的显示与隐藏
- 安装Helm
- ajax之发送post请求
- 【ASP.NET】@RenderBody,@RenderPage,@RenderSection的使用
- 判断Json字符串返回类型 对象 或者 数组