社区
Java SE
帖子详情
匿名局部類的方法中不能訪問外部類的非final變量
qojnbbqtg
2010-04-07 02:23:02
我想知道為什麽。。。為什麽一定加上final才行。。
...全文
43
5
打赏
收藏
匿名局部類的方法中不能訪問外部類的非final變量
我想知道為什麽。。。為什麽一定加上final才行。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
keeya0416
2010-04-07
打赏
举报
回复
[Quote=引用 3 楼 goldenfish1919 的回复:]
跟变量和对象的生命周期有关系。对象的声明周期是不确定的,何时由垃圾回收是不确定的,而变量的生命周期是一定的,final就是为了延长变量的生命周期。
[/Quote]
就是这个意思
来晚了 分被人抢了
amdgaming
2010-04-07
打赏
举报
回复
呵呵 垃圾回收进制
若鱼1919
2010-04-07
打赏
举报
回复
跟变量和对象的生命周期有关系。对象的声明周期是不确定的,何时由垃圾回收是不确定的,而变量的生命周期是一定的,final就是为了延长变量的生命周期。
qojnbbqtg
2010-04-07
打赏
举报
回复
to lijianjian578286:
不知道你沒明白我的意思,還是我沒明白你的意思。。。
jacky花园
2010-04-07
打赏
举报
回复
匿名类本身没有名字,你如何继承它?
所以天生不具备继承的特性,理所当然的是final.
关于为什么内部类
不能
访问
外部
类
方法
中
的
局部
变量,除
非
该变量被声明为
final
类型的疑问?
关于为什么内部类
不能
访问
外部
类
方法
中
的
局部
变量,除
非
该变量被声明为
final
类型的疑问? 1. 这里所说的“
匿名
内部类”主要是指在其
外部
类的成员
方法
内定义的同时完成实例化的类,若其访问该成员
方法
中
的
局部
变量,
局部
变量必须要被
final
修饰。原因是编译器实现上的困难:内部类对象的生命周期很有可能会超过
局部
变量的生命周期。 2.
局部
变量的生命周期:当该
方法
被调用时,该
方法
中
的
局部
变量在栈
中
被创建...
匿名
内部类
不能
访问
外部
类
方法
中
的
局部
变量
这里所说的“
匿名
内部类”主要是指在其
外部
类的成员
方法
内定义,同时完成实例化的类,若其访问该成员
方法
中
的
局部
变量,
局部
变量必须要被
final
修饰。 原因是编译程序实现上的困难:内部类对象的生命周期会超过
局部
变量的生命周期。
局部
变量的生命周期:当该
方法
被调用时,该
方法
中
的
局部
变量在栈
中
被创建,当
方法
调用结束时,退栈,这些
局部
变量全部死亡。而内部类对象生命周期与其它类一样:自创建一个
匿名
内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才会死亡(被JVM垃圾回收)。所以完全可能出现的一
匿名
内部类访问
外部
类
方法
中
的
局部
变量
匿名
内部类
不能
访问
外部
类
方法
中
的
局部
变量,除
非
变量被声明为
final
类型 1. 这里所说的“
匿名
内部类”主要是指在其
外部
类的成员
方法
内定义,同时完成实例化的类,若其访问该成员
方法
中
的
局部
变量,
局部
变量必须要被
final
修饰。 2. 原因是编译程序实现上的困难:内部类对象的生命周期会超过
局部
变量的生命周期。
局部
变量的生命周期:当该
方法
被调用时,该
方法
中
的
局部
变量在栈
中
被创建,当
方法
调
匿名
类
中
的
方法
为什么
不能
修改
外部
类的
局部
变量?
匿名
类
中
的
方法
为什么
不能
修改
外部
类的
局部
变量? 首先
局部
变量是定义在栈
中
的,一旦超出其作用范围就立马销毁释放。而
匿名
类
中
的
方法
是跟
匿名
对象绑定的,通过new实例化,放在堆
中
,只要java垃圾回收线程不释放它,它就长期存在。 因此在
匿名
类调用
外部
类的普通
局部
变量就有可能出错,因为该
局部
变量可能已经被释放。所以为了能让
匿名
类也能方便使用
外部
类
中
局部
变量。java干脆直接把在
匿名
类
中
使用的
外部
类
中
的
局部
变量变成
final
类型,因为
final
类型为常量也是放在堆
中
的。这样当
匿名
类调用该
局部
变量时,就不会出现
为什么 Lambda 表达式(
匿名
类)
不能
访问
非
final
的
局部
变量呢?
这里记一个知识点 Lambda 表达式(
匿名
类)
不能
访问
非
final
的
局部
变量 因为实例变量存在堆
中
,而
局部
变量是在栈上分配,存在于虚拟机栈的
局部
变量表
中
,Lambda 表达(
匿名
类) 有可能会在另一个线程
中
执行。如果在线程
中
要直接访问一个
局部
变量,可能线程执行时该
局部
变量已经被销毁了,而
final
类型的
局部
变量在 Lambda 表达式(
匿名
类)
中
其实是
局部
变量的一个拷贝 ...
Java SE
62,616
社区成员
307,307
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章