黑马程序员技术交流社区
标题:
匿名内部类的理解
[打印本页]
作者:
杨银川
时间:
2011-12-14 00:13
标题:
匿名内部类的理解
本帖最后由 杨银川 于 2011-12-14 19:47 编辑
今天看视频老师说了一句话:“因为是匿名类所以对访问的局部变量进行final修饰”。我对此有些疑惑,请大家
帮我解释一下,谢谢
作者:
吴上储
时间:
2011-12-14 00:22
因为编译器不允许你在匿名内部类里改变外部类的局部变量,所以要求为final的.
这是因为局部变量的生命周期最多就是他所在方法的生命周期,但是内部类的生命周期有可能比该外部类方法的生命周期还要长
例如:
public class Test {
public void a() {
final String aa = "aaa";
new TestInner(){
...
}.start();
}
abstract class TestInner extends Thread{
public void run() {
. . .
}
}
}
复制代码
执行完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