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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丰亚彬 高级黑马   /  2012-5-27 10:27  /  1709 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丰亚彬 于 2012-5-27 18:50 编辑

老师在讲到内部类在局部时,如果要访问局部变量要把变量改成最终类型final,老师只说这是一个规则,我想问一下:为什么?反复看了好几遍也没明白

7 个回复

倒序浏览
方法中的内部类能不能访问方法中的局部变量归根到底是由于方法中的内部类所在方法中的局部变量的生命
周期要短于其所在的内部类的生命周期。

  描述:方法中的内部类定义在方法的内部,它可以访问方法中的变量和参数,当方法被调用时,局部变量和
  参数在栈内存中入栈,然后再在堆内存中创建一个内部类对象,方法调用结束后栈内存中的变量和参数就出
  栈消亡了,但是堆内存中的内部类对象是在没有对象变量引用它的时候才会被垃圾回收器给回收了,所以完
  全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会
  超过局部变量。如果此时再调用内部类所在对象的方法,会由于局部变量不能访问发生编译错误。
  
  
  解决办法:内部类对象可以访问同一个方法中被定义为final的局部变量。定义为final后,编译程序的实现
  方法:将所有的内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这样,
  即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而LLC对象在局部变量死亡后,照
  样可以访问final型局部变量。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
蒋映辉 发表于 2012-5-27 10:39
方法中的内部类能不能访问方法中的局部变量归根到底是由于方法中的内部类所在方法中的局部变量的生命
周期 ...

思路我理解了,根据你的回答,有个问题,将局部变量定义成final后,此时的局部变量会成为内部类的一个成员变量吗?
回复 使用道具 举报
本帖最后由 蒋映辉 于 2012-5-27 11:10 编辑

我觉得不是  加final的目的只是为了类似于延长它的生命周期吧  你可以自己敲代码验证一下
回复 使用道具 举报
兄弟,造物主就是这样的定义,既然人家给它起了这个名字,这个名字就代表虚拟机该执行什么,里面到底怎么执行,就有待你挖掘咯。
回复 使用道具 举报
蒋映辉 发表于 2012-5-27 11:08
我觉得不是  加final的目的只是为了类似于延长它的生命周期吧  你可以自己敲代码验证一下 ...

呃,我原来想的也是生命周期的问题,你刚才回答我能明白,就有一点。。。为什么加final的局部变量在方法结束后里面的局部变量都出栈了,但内部类还能访问这个变量,是因为这个变量因为加上了final修饰后,在内存其它地方又拷贝了一份吗?

正常情况下在方法里的局部变量,方法结束后都是要出栈的。。。
回复 使用道具 举报
丰亚彬 发表于 2012-5-27 11:22
呃,我原来想的也是生命周期的问题,你刚才回答我能明白,就有一点。。。为什么加final的局部变量在方法 ...

楼主还是对堆内存和栈内存理解不够深入啊,内部类不能访问方法局部变量,想访问必须final,因为内部内是一个类,是在堆内存里,创建对象也在堆内存,在内部内访问方法的局部变量就是栈内存的局部变量,用堆内存的数据去访问栈内存的数据是访问不到的,因为堆内存比栈内存存活时间长,所以加上final则变量就变成常量,常量是放在常量池也在堆内存,所以存活时间一样长.
回复 使用道具 举报
黑马-唐磊 发表于 2012-5-27 14:14
楼主还是对堆内存和栈内存理解不够深入啊,内部类不能访问方法局部变量,想访问必须final,因为内部内是一个 ...

呃,你前面说的我都知道,我需要的就是你最后一句话,哈哈~~~~局部变量加上final就会从栈存放到堆内存中的常量池里,问题搞明白了~~~~谢谢啦~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马