1. 这里所说的“匿名内部类”主要是指在其外部类的成员方法内定义,同时完成实例化的类,若其访问该成员方法中的局部变量,局部变量必须要被final修饰。
2. 原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命周期。局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类一样:自创建一个匿名内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方法已调用结束,局部变量已死亡,但匿名内部类的对象仍然活着。
3. 如果匿名内部类的对象访问了同一个方法中的局部变量,就要求只要匿名内部类对象还活着,那么栈中的那些它要所访问的局部变量就不能“死亡”。
4. 解决方法:匿名内部类对象可以访问同一个方法中被定义为final类型的局部变量。定义为final后,编译程序的实现方法:对于匿名内部类对象要访问的所有final类型局部变量,都拷贝成为该对象中的一个数据成员。这样,即使栈中局部变量已死亡,但被定义为final类型的局部变量的值永远不变,因而匿名内部类对象在局部变量死亡后,照样可以访问final类型的局部变量,因为它自己拷贝了一份,且与原局部变量的值始终一致。

最后,Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰

最新文章

  1. 理解css margin
  2. Intent之前的对象传递与fragment传递数据
  3. 关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
  4. 动易CMS之标签管理
  5. c/c++面试题(6)运算符重载详解
  6. C类型
  7. 使用UI Automation实现自动化测试 --工具使用
  8. 微信小程序购物商城系统开发系列
  9. 45个有新意的Photoshop教程和技巧
  10. CMake编译linux C++
  11. 什么是券商PB业务
  12. 不重新编译PHP文件的情况下php GD库扩展库的编译安装(centos)
  13. Oracle教程-常用命令(二)
  14. ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
  15. library 显示所有的数据
  16. C++ DWORD 转byte char 数组、指针
  17. 062——VUE中vue-router之命名视图的实例
  18. ubuntu下的烧录工具
  19. 传递的值是this,在js里就不用再写$(this)
  20. Rabbitmq -- direct

热门文章

  1. Java面向对象程序设计作业目录(作业笔记)
  2. 【MySQL作业】DDL 和 DML——美和易思使用 DDL 定义数据库表结构应用习题
  3. golang mongodb 驱动二次封装
  4. 使用.NET 6开发TodoList应用(22)——实现缓存
  5. Go语言系列之标准库os
  6. golang gin框架中实现大文件的流式上传
  7. 【记录一个问题】android opencl c++: 使用event.SetCallBack()方法后,在回调函数中要再使用event.wait()才能得到profile信息
  8. Python 根据id生成唯一码
  9. Cesium中级教程7 - Geometry and Appearances 几何图形和外观
  10. 使用VS Code的MySQL扩展管理数据库