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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 yangfengxiao 于 2012-9-30 10:01 编辑
  1. class Outer {
  2. void show() {
  3. final int num = 5;   为什么num要定义成final呢?? 别人的解释如下。方法中的局部变量在栈中被创建;当方法调用结束时,释放栈空间。内部类对象生命期是和其它类一样,创建一个局部内部类对象后,当没有其它类再引用时,它才释放。所以局部类的对象生命期会超过局部变量。
  4. 现在的问题是。关于内部类对象和局部变量的生命周期在我代码中是如何体现呢?或者以别的方式给我讲懂吧~~~
  5. class Inner {
  6. void fun() {
  7. System.out.println(num);
  8. }
  9. }
  10. Inner in = new Inner();
  11. in.fun();
  12. }
  13. }

  14. public class Test {
  15. public static void main(String[] args) {
  16. Outer out = new Outer();
  17. out.show();
  18. }

  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 张淼 于 2012-9-30 09:36 编辑

方法中的内部类只能访问方法中被定义为final的局部变量,而不能访问方法中的非final变量。
原因:        这是由方法中局部变量的生命周期与方法中内部类的生命周期的不同导致的。        
        当方法运行结束后,方法内的局部变量就不存在了,而方法中的内部类对象可能还存在,
        所以,若可以访问方法中的局部变量的话,就造成了该对象访问了一个不存在的变量。
        其解决办法是将变量复制了一份到内部类中,而如果不定义为final的话,当修改了变量时,
        就会造成原变量与复制后的变量的值不一致的情况。当定义为final时,其值不可以被改变,
        所以可以保证所复制的值与原值相同。
        这样,将变量定义为final,就解决了这种调用问题。

        这样说可以理解么?
----------------------------------好的,下面说下例子里面的----------------------------------
  • class Outer {
  • void show() {       //这个show函数仅在调用时加载进内存,然后创建int num=5; 调用之后int num=5就会消失,如果消失之后,其他的类中创建了Inner类的对象,而Inner类的对象需要调用int num=5,这就导致了它调用的值在内存中已经不存在了,这就是问题的原因。下面是定义为final的解决办法。
  • final int num = 5; //注意,当将其值定义为final并不是指直接调用的就是这个值,而是内部类中将其值复制了一份存储了而已。
  •                            //而如果不用final的话,当修改这个值,或者内部类中的复制的值就会出现,他们的值不同。但本质上他们应该是相同的,所以定义为final。
  •                           //
  • class Inner {
  • void fun() {
  • System.out.println(num);
  • }
  • }
  • Inner in = new Inner();
  • in.fun();
  • }
  • }
  • public class Test {
  • public static void main(String[] args) {
  • Outer out = new Outer();
  • out.show();
  • }
  • }

点评

不好意思,麻烦你看清我的问题:解释在我的代码中是如何体现的。。。。  发表于 2012-9-30 09:18

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
张淼 发表于 2012-9-30 09:13
方法中的内部类只能访问方法中被定义为final的局部变量,而不能访问方法中的非final变量。
原因:         ...

已重新编辑,你再看看吧。
回复 使用道具 举报

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个问题每隔几天就有人问一次
其实说更直白点,
局部内部类是不能调用外部的局部变量的
它只是通过了一种拷贝方式达到了看似调用的效果。Java采用了一种copy   local   variable的方式来实现
也就是将外面的局部变量复制到 内部类中
但是这样有一个缺陷:如果在inner里对该复制的局部变量进行赋值操作,那么外边的x并不会被改变。所以为了保证内外的一致性
才要求 设定为final 终态 不可改变

点评

相当到位  发表于 2012-9-30 10:16
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马