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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王亚男 黑马帝   /  2012-3-5 10:54  /  2800 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么局部内部类中只能访问所在方法的final变量?
请问这个应该怎么理解呢?

5 个回复

倒序浏览
这里涉及到一个生命周期问题,不是final的局部变量,你的方法结束了就没了。但是你的内部类却不是和你的方法同时执行的,当你事件发生的时候才会执行,这时你的方法已经结束了,这样应该哪里找这个局部变量呢?
回复 使用道具 举报
在使用内部类是时候,程序是先执行外部类,当执行到内部类是,外部类的生命周期已经结束
回复 使用道具 举报
额,看你的问题啦:是这样的:
(1)所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,是天经地义的。那么为什么要加上一个final呢?
(2)原因是:编译程序实现上的困难,难在何处:内部类对象的生命周期会超过局部变量的生命期。为什么?表现在:局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建(诞生),当方法调用结束时(执行完毕),退栈,这些局部变量全部死亡。而:内部类对象生命期,与其它类一样,当创建一个该局部类对象后,只有没有其它人再引用它时,它才能死亡。完全可能:一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。
(3)退一万步:局部类的对象生命期会超过局部变量又怎样?问题的真正核心是:如果:局部内部类的对象访问同一个方法中的局部变量,是天经地义的,那么:只要局部内部类对象还活着,则:栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?),这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。而:正是这一点是不可能做到的

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 很给力!

查看全部评分

回复 使用道具 举报
张开开 发表于 2012-3-5 11:36
这里涉及到一个生命周期问题,不是final的局部变量,你的方法结束了就没了。但是你的内部类却不是和你的方 ...

谢谢您!
我是这样理解的,即使是final修饰的变量,但是方法结束的时候还是会被释放。
所以,我就创建了一个外部类对象,调用function()方法返回并接收一个内部类对象。
这时,function()方法结束了,按正常的理解,这里的x和y都会被释放了,当然x在这不能编译通过。
可是这时候我调用局部内部类的show()方法却依然能打印出y的值。
我在想,会不会是被final修饰的变量会不会在局部内部类有个隐藏的备份?这时候调用的是否就不是方法体中的y了?
如果是这样的话,就能理解为什么要用final修饰了,如果不被final修饰的话,这个变量可以被更改,就意味着局部内部类就不知道该备份哪个数据了吧。
  1. interface Inner
  2. {
  3.         void show();
  4. }
  5. class Outer
  6. {
  7.         public Inner function()
  8.         {
  9.                 //int x = 0;
  10.                 final int y = 1;
  11.                 return new Inner()
  12.                 {
  13.                         public void show()
  14.                         {
  15.                                 //System.out.println("x="+x);
  16.                                 System.out.println("y="+y);
  17.                         }
  18.                 };
  19.                
  20.         }
  21. }
  22. class  OuterClassDemo
  23. {
  24.         public static void main(String[] args)
  25.         {
  26. //                new Outer().function().show();
  27.                 Outer out = new Outer();
  28.                 Inner in = out.function();
  29.                 in.show();
  30.         }
  31. }
复制代码
回复 使用道具 举报
本帖最后由 qwert 于 2012-3-5 14:07 编辑
舞动的心弦 发表于 2012-3-5 12:50
额,看你的问题啦:是这样的:
(1)所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类, ...


真是谢谢您!我好像理解些了。
一个问题琢磨好几个小时候了,也真是头痛!
太谢谢了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马