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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨银川 黑马帝   /  2011-12-14 00:13  /  2089 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨银川 于 2011-12-14 19:47 编辑

今天看视频老师说了一句话:“因为是匿名类所以对访问的局部变量进行final修饰”。我对此有些疑惑,请大家
帮我解释一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

3 个回复

倒序浏览
因为编译器不允许你在匿名内部类里改变外部类的局部变量,所以要求为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 的生命周期就还没完

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
同楼上,内部类对象的生命周期会超过局部变量的生命期,多说一句:
局部变量用final修饰就相当与变成了一个常量,延长了该变量的生命周期(所在类存在时永远有效),So,当该方法消亡时,其内部类仍然可以访问该final修饰的变量!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
吴上储 发表于 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应该是接口啊?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马