• 主页
  • Java SE
  • J2ME
  • Web开发
  • Java EE
  • Eclipse

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

bloomzy 2013-12-31 08:54:38
如题所示,为什么必须是final呢?
...全文
208 点赞 收藏 7
写回复
7 条回复
blmdlm 2014年03月01日
举个例子 class A{ start(int i){ class B{ i++; } } } 如果不将i设为final,就不会使得start()函数的局部变量和局部类内建立的拷贝保持一致
回复 点赞
bloomzy 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里是没有那些参数和局部变量名的,后来版本有没有没观察过。 总结一下,就是会导致局部变量提升为一种隐式的成员变量。
回复 点赞
发动态
发帖子
Java
创建于2007-09-28

1.8w+

社区成员

8.1w+

社区内容

Java相关技术讨论
社区公告
暂无公告