当所在的方法的形参需要被内部类里面使用时,该形参必须为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。

最新文章

  1. RAID磁盘阵列的搭建(以raid0、raid1、raid5、raid10为例)
  2. 关于图像文章垂直无缝连接滚动——JS实现
  3. mysql查询所有记录,并去掉重复的记录
  4. Java NIO示例:多人网络聊天室
  5. 在Unity中使用贝塞尔曲线(转)
  6. 剑指 offer set 6 打印从 1 到 N 的所有数
  7. lintcode:anagrams 乱序字符串
  8. linux查看硬件环境
  9. 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治
  10. mahout算法源码分析之Itembased Collaborative Filtering(二)RowSimilarityJob
  11. mysql2redis
  12. VC Windows系统服务创建代码
  13. 论文翻译:Neural Networks With Few Multiplications
  14. Python3.x在linux下print中文问题
  15. 【原创】python嗅探QQ消息实战
  16. easyUI tab页的显示与隐藏
  17. 安装Helm
  18. ajax之发送post请求
  19. 【ASP.NET】@RenderBody,@RenderPage,@RenderSection的使用
  20. 判断Json字符串返回类型 对象 或者 数组

热门文章

  1. String.trim的作用
  2. Qt Designer中自定义控件的使用(提升法与插件法)
  3. python爬虫:了解JS加密爬取网易云音乐
  4. 页面模型 PageModel
  5. weblogicSSRF漏洞复现
  6. 获取访问者真实ip地址?我觉得不可能
  7. Centos7 出现Welcome to emergency mode!【紧急模式】
  8. 【springboot】事务处理
  9. 03.SpringMVC之器
  10. 使用dom4工具:增删改xml文件(七)