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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢洋 高级黑马   /  2013-2-17 16:27  /  2678 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么内部类或匿名内部类访问外部类的局部变量时,
要用final修饰?
按毕老师的说讲法:被final修饰的变量只能赋一次值,这跟内部类调用局部变量有什么关系?
谁可以给一个详细的回答??
public class OuterTest
{ private static innerTest inner;
int x =3;

void method(final int a)
{
  int y = 4;
  final int z = 4;
  class Inner
  {
   void funtion()
   {
    System.out.println(x);
    System.out.println(a);
    //System.out.println(y);//报错
    System.out.println(z);
   
   }
  }
  
}
}

3 个回复

倒序浏览
你可以看看这个帖子啊,是别人问的,是同类型的问题。你可以看看:http://bbs.itheima.com/thread-38319-1-1.html
解释如下:
在java中,方法是一种状态,是不能被存储的,对象才是真正被存储在堆内存中的。匿名内部类是在内部,是局部的,它所处的外部环境即方法,在执行完后就不存在了,但是内部类作为一个对象,是有可能被存储下来的。而局部变量也是如此,局部变量时存在于栈内存中的,使用完了就立即被消灭掉了,而匿名内部类访问局部变量,也是对它的一个拷贝而已;那么试想,局部变量都没了,匿名内部类还存在,这个匿名内部类要去哪找这个变量啊,她找不到局部变量这孩子,多着急,只能让虚拟机报警了(编译失败)。所以就要将这个局部变量变为永久的常量才行。

评分

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

查看全部评分

回复 使用道具 举报
这个问题多的很 , 建议由问题先在论坛找找看
因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象
首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。
如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,
然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到了。
如果定义为final,java会将这个变量复制一份作为成员变量内置于内部类中,
这样的话,由于final所修饰的值始终无法改变,所以这个变量所指向的内存区域就不会变。
简单说就是,不能让内部类正用或没执行完的时候让局部变量改变,那样就出现了错误,为了保证不发生这种情况,所以要让他不能变

评分

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

查看全部评分

回复 使用道具 举报
沙发正解,藤椅正解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马