匿名内部类访问外部的局部变量时该变量为什么必须是final的?

bloomzy 2013-12-31 08:54:38
如题所示,为什么必须是final呢?
...全文
331 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
blmdlm 2014-03-01
  • 打赏
  • 举报
回复
举个例子 class A{ start(int i){ class B{ i++; } } } 如果不将i设为final,就不会使得start()函数的局部变量和局部类内建立的拷贝保持一致
「已注销」 2014-01-01
  • 打赏
  • 举报
回复
引用 5 楼 Lsheep 的回复:
在匿名类中需要传递进来final关键字,java希望的是保证内部实现和外在表现的一致性 http://491823151.iteye.com/blog/1052895
good,懂了,灰常感谢。
suciver 2013-12-31
  • 打赏
  • 举报
回复
这种问题不要问,这就好比为什么定义接口要用interface关键字一样,java的死规定没为什么
coolbamboo2008 2013-12-31
  • 打赏
  • 举报
回复
不final,编译通不过 呵呵,其实我是这么理解的,内部类其实也算是个类吧,访问宿主(也算是另一个类吧)里的东西,要考虑安全,那么,要安全,就最好让它别动,别动!别再被继承和访问,所以就final了
Lsheep 2013-12-31
  • 打赏
  • 举报
回复
在匿名类中需要传递进来final关键字,java希望的是保证内部实现和外在表现的一致性 http://491823151.iteye.com/blog/1052895
rockets311 2013-12-31
  • 打赏
  • 举报
回复
final的会活的时间长点。。。
临碣 2013-12-31
  • 打赏
  • 举报
回复
你们这么能这么回答呢,这样多无聊啊。 以下根据多年前考证这个问题的时候残存的记忆整理: 其实是这样的,加上final的局部变量,在javac编译的时候,会把这个变量提升为和类属性同级的变量,也就是说这个变量不是在执行栈里,而是在外部对象的堆中保存。这样就可以通过外部对象的this来引用到了。 部分验证是这样的。带有内部类的java编译之后有.class和带$的class,那个$的是内部类。 用二进制编辑器或者文本编辑器打开外部类的.class,你可以在一堆符号中,找到那个被提升后的变量名。以前.class里是没有那些参数和局部变量名的,后来版本有没有没观察过。 总结一下,就是会导致局部变量提升为一种隐式的成员变量。

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧