黑马程序员技术交流社区

标题: 匿名内部类的理解 [打印本页]

作者: 杨银川    时间: 2011-12-14 00:13
标题: 匿名内部类的理解
本帖最后由 杨银川 于 2011-12-14 19:47 编辑

今天看视频老师说了一句话:“因为是匿名类所以对访问的局部变量进行final修饰”。我对此有些疑惑,请大家
帮我解释一下,谢谢
作者: 吴上储    时间: 2011-12-14 00:22
因为编译器不允许你在匿名内部类里改变外部类的局部变量,所以要求为final的.

这是因为局部变量的生命周期最多就是他所在方法的生命周期,但是内部类的生命周期有可能比该外部类方法的生命周期还要长
例如:
  1. public class Test {
  2.     public void a() {
  3.         final String aa = "aaa";
  4.         new TestInner(){
  5.             ...
  6.         }.start();
  7.     }

  8.     abstract class TestInner extends Thread{
  9.         public void run() {
  10.                   . . .
  11.          }
  12.     }
  13. }
复制代码
执行完start() 之后方法a 的生命周期就已经结束了,局部变量aa 也跟着结束生命周期了
但是只要线程里的 run 方法没有执行完,内部类TestInner 的生命周期就还没完
作者: 小春同学    时间: 2011-12-14 01:01
同楼上,内部类对象的生命周期会超过局部变量的生命期,多说一句:
局部变量用final修饰就相当与变成了一个常量,延长了该变量的生命周期(所在类存在时永远有效),So,当该方法消亡时,其内部类仍然可以访问该final修饰的变量!
作者: 杨银川    时间: 2011-12-14 01:12
吴上储 发表于 2011-12-14 00:22
因为编译器不允许你在匿名内部类里改变外部类的局部变量,所以要求为final的.

这是因为局部变量的生命周期 ...

比如下面:final Iterator<FileInputStream> it=arr.iterator();
        Enumeration<FileInputStream> en=new Enumeration<FileInputStream>() {
               
                public FileInputStream nextElement() {
                        // TODO Auto-generated method stub
                        return it.next();
                }
               
                public boolean hasMoreElements() {
                        // TODO Auto-generated method stub
                        return it.hasNext();
                }
        };
其中的 it 被final修饰,怎么看其中的匿名类呢,Enumeration应该是接口啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2