A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘凯 金牌黑马   /  2013-2-4 20:46  /  1764 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘凯 于 2013-2-4 23:50 编辑

在毕老师的java课程中有一个内部类定义在局部时,内部类访问局部变量的问题,老师只是匆匆说过,局部内部类访问局部类变量,此变量必须得final修饰,没有说明具体讲解原因,看了个相关的帖子,感觉没能实质的说明,求大神指点迷津。
  1. class Outer
  2. {
  3.         void method()
  4.           {
  5.               final int y = 2;
  6.                 class Inner
  7.                      {
  8.                            void function()
  9.                                 {
  10.                                      System.out.println(y);
  11.                                  }
  12.                      }
  13.                 new inner().faction();
  14.            }
  15. }
复制代码
问什么y必须声明为最终类型?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
(1).所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却必须要加上一个final。

(2).原因是编译程序实现上的困难:内部类对象的生命周期会超过局部变量的生命期。

局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。

内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。

所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。

(3).局部内部类的对象访问同一个方法中的局部变量,那么这就要求只要局部内部类对象还活着,那么栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?)。这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。

(4).解决方法:局部内部类的对象可以访问同一个方法中被定义为final的局部变量。

定义为final后,编译程序的实现方法:将所有的局部内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。(这一点我有些怀疑)

(5).归纳总结:局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
周怡 发表于 2013-2-4 21:25
(1).所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却 ...

谢谢,受教。
回复 使用道具 举报
胡发友 发表于 2013-2-4 21:37
同学,看看这里:http://bbs.itheima.com/forum.php?mod=viewthread&tid=20708&highlight=%E5%B1%80%E9%83% ...

谢谢,似乎明白了
回复 使用道具 举报
杨芳 来自手机 中级黑马 2013-2-5 16:35:21
地板
顶!!!!!来自: Android客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马