为什么局部内部类所用的变量要用final修饰,网上有很多说法,有说内部类,与局部变量生命周期的,
2条回答 默认 最新
- 关注
码龄 粉丝数 原力等级 --
- 被采纳
- 被点赞
- 采纳率
Goskalrie 2016-06-01 13:41最佳回答 专家已采纳final的原因:内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,这些局部变量消失。但是内部类对象的生命期与其它类一样,当创建一个该局部类对象后,只有当所有引用都断开时,才会消失。
但是如果局部内部类的对象访问其所在方法的局部变量,只要局部内部类对象还活着,栈中的那些在内部类还引用着的局部变量就不能消失,换句话说:局部变量的生命期至少等于或大于局部内部类对象的生命期——与上面完全互相矛盾。解决的办法:局部内部类的对象可以访问其所在方法中的局部变量,但是这个变量必须被定义为final.因为final修饰后,若在内部类访问了其所在方法中的该局部变量,编译器会在内部内中保存该局部变量的一份copy,但是copy后,两边其实都是一个东西,为了防止其中之一被修改,造成混乱,干脆让该变量为只读的。即使外部变量已经消失,copy还是存在的,且不会混乱。采纳该答案 已采纳该答案 专家已采纳评论解决 2 无用打赏举报微信扫一扫
分享评论登录 后可回复...
查看更多回答(1条)
报告相同问题?
提交
相关推荐 更多相似问题
- 2016-05-28 04:21回答 2 已采纳 final的原因:内部类对象的生命周期会超过局部变量的生命期。局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,这些局部变量消失。但是内部类对象的生命期与其它类
- 2017-03-13 15:28回答 1 已采纳 http://blog.csdn.net/mark_to_win/article/details/38821033
- 2017-05-19 06:36回答 4 已采纳 @Override public int product() { // TODO Auto-generated method stub return (int) Math.round(M
- 2021-03-10 06:34weixin_28871989的博客 内部类访问局部变量为什么必须要用final修饰看了大概五六篇博客, 讲的内容都差不多, 讲的内容也都很对, 但我觉得有些跑题了略叙一下String s = "hello";class Inner implements Runnable {public void run() {System...
- 一枚奶爸的博客 我们先稍微看一下代码:从这里的提示可以看到,必须要将a的修饰符变为final才行。现在笔者就这一结果做出自己的分析:首先来说,我们知道,方法被调用时会执行,当执行的时候,方法中的局部变量会加载到栈内存中,...
- 2021-03-10 06:34阿廖林诺的博客 发如今方法内定义内部类时,若是内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的缘由,由于方法内定义的变量是局部变量,离开该方法,变量就失去了做用,...
- 2015-12-16 06:27回答 5 已采纳 关于什么是实体类,可以看这里:[Java,什么是实体类,实体类有什么用?](http://blog.csdn.net/a2806005024/article/details/34082405 "")
- 2017-07-20 09:02回答 8 已采纳 这两个a对象是不同的对象,因此a.c不是同一个变量,你给不同的变量赋值,谈不上可以不可以修改
- 2017-07-20 19:18回答 4 已采纳 如果你的变量只做读取是可以不用显式的声明为final类型 但是有修改操作就会报错 谢谢
- 2021-02-13 01:28bfecoder的博客 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,...
- 2016-05-22 10:16yinbucheng的博客 因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更广的生命周期,下面通过一个实例加以说明: 如例中所示,在外部类Outer中声明了...
- weixin_39600885的博客 Java中final关键字的用法总结1、final修饰类被final修饰的类不能被继承,因此final类的成员方法也不能被覆写,被final关键字修饰的类没有子类,因此类的实现细节也无法改变,无法被扩展。final类中的所有成员方法...
- 2021-10-10 21:07回答 4 已采纳 首先,你看一下你的子类代码,那叫重新赋值吗?应该是在子类中开辟一个空间用来存放新的变量名X,你并没有使用父类里的X,如果你要使用直接像这样就行了 另外要纠正一点,就是如果在一个类里面定义变量在方法外
- 2021-12-19 23:46回答 1 已采纳 这么说吧 static 声明的东西需要依赖一份文件,属于某一份文件的,比如你在A类内声明一个内部静态类B,编译之后,其实会有两份文件,A和A.B
- 2016-08-29 05:07回答 2 已采纳 这个变量b不用final修饰能通过编译?你运行不出错吗?
- 2021-02-28 15:35流光微记的博客 转载地址:http://blog.csdn.net/zzp_403184692/article/details/8014235今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到...
- 2017-03-14 17:47Lynson666的博客 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,...
- 2013-07-11 23:23scyatcs的博客 问题: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image);... final Cl
- 2016-12-02 11:00回答 3 已采纳 1.首先,size这里的含义是每个目录的大小,这个getSize()方法返回的就是每个目录的大小,显然是每个目录一个变量是正确的,使用全局的变量 实际上加了好多遍。自己想想,应该不难想明白。
- 2016-05-31 15:25伪文艺编程妞的博客 final修饰的实例变量 被final修饰的实例变量必须显示指定初始值,而且只能在如下3个位置指定初始值: 1.定义final实例变量时指定初始值; 2.在非静态初始化块中为final实例变量指定初始值 3.在构造器中为...
- 没有解决我的问题, 去提问