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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Neverbelazy 于 2013-4-19 20:57 编辑

毕老师Java 基础视频Day10 中提到过 定义在局部的内部类如果调用局部变量,此局部变量需要被标记为final。
比如:
  1. class Outer{
  2. void method{
  3. final int x=0;
  4. class Inner{
  5. void function(){
  6. System.out.print(x);
  7. }
  8. }
  9. }
  10. }
复制代码
毕老师给出了结论,没有给出具体的说明,我自己思考了一些理由,写在这里,欢迎大家指正,谢谢!

我认为,原因由如下3点组成:
1. 局部变量在栈中,是在代码方法执行的时候被调用的。内部类的对象在堆中,是随着对象的生产而产生的;
2. 堆中的对象是可以根据程序运行时被对象的引用(栈中数据)调用,甚至改变的;但是栈中的数据一般不会也不应该在堆中被类的内部运算所调用甚至改变 (个人对这点有点不确定,希望给予指正)
3. 当内部类被定义在局部时,却造成了,局部的变量(栈中数据)可以被堆中数据使用的情况,为了避免这种堆中使用数据时改变了栈中数据的情况,所以强制的让这种调用,只能实用final修饰的局部变量

如果不用final会有什么情况? 如果没有final,那么,栈中的数据就会被内部类所改变,而这种状况是不可知的(因为类对代码的封装封装),所以会导致很多意外的情况发生。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

10 个回复

倒序浏览
~(@^_^@)~ 发表于 2013-4-19 21:24
内部类,定义在了外部类的局部位置上,如果访问局部变量,这个变量必须加final
------------原因是生命周 ...

谢谢你的意见,不过有一点我还是不太理解:

被final修饰的类如果是常量的话,生命周期最长的话,它是怎么被调用的呢? 比如说怎么实现下面代码?
  1. class Test{
  2. final int x=99;
  3. }

  4. class Get{
  5. public static void main{String[] args}{
  6. 怎样得到 Test类中x的值?
  7. }
复制代码
回复 使用道具 举报
杜鹏飞 发表于 2013-4-19 22:34
你自己猜测的其实是不正确的.
局部变量是必须加final的,而数据成员则不必要.
至于为何必须加final,这与java ...

谢过回复。。。不过上面的引用 JVM doc好像也没解释我的问题啊???
回复 使用道具 举报
本帖最后由 Neverbelazy 于 2013-4-20 13:47 编辑
杜鹏飞 发表于 2013-4-20 11:08
被final修饰的量并不能称之为生命周期最长的,最长的应是被static修饰的量.

ok 这种情况确实是,虽然我没见过这段代码,不过可以看出在这段代码还是 new 了一个 Test()类才实现的调用x. (而且,这里面相当于是调用了 Test.class中的代码 得到的x) ,那么不就是说,这段代码的实现是在有了一个 Test()类对象的情况下才实现的吗?那不就是说其实final int x 的生命周期是小于Test()类对象的,也就是说上面的final修饰的代码没有延长x的生命周期。
那我们试想这样一个情况,也是我们讨论的情况,如果final被定义在局部的话,我们怎么得到这个x (这个x的生命周期是不是就是在所包含的{}局部内呢)?

请指正,谢谢:
  1. class Test{
  2. private void testForFun(){
  3. {
  4. final int x=99;
  5. }
  6. }

  7. private void testForQue(final int y){
  8. System.out.println(y);
  9. }
  10. }
  11. public class Get{
  12. public static void main(String[] args){
  13. 如何实用一段代码得到 x?
  14. 上面代码中的y是何时被生成的?
  15. }
  16. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
杜鹏飞 发表于 2013-4-20 11:09
试试过一两个月再看我摘录的这段话.

ok 我先看完java基础课程,再有时间研习下 JVM的机制。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马