您的位置:首页 > 编程语言 > Java开发

Java方法内部类为什么需要方法形参或变量是final的?

2013-10-22 18:06 399 查看
局部内部类

即定义在方法中的内部类。由于本身就在方法内部(可出现在形参定义处或方法体处),因而,访问方法中的局部变量或形参是很正常的事情。
局部变量的生命周期与局部内部类的生命周期可能不一致。先看下面的示例代码
public class TestInnerClass {
public static void main(String[] args){
TestInnerClass test=new TestInnerClass();
test.testRun();
}

public void testRun(){
Thread t=new Thread(getRun());
t.start();
}

public Runnable getRun(){
final List<String> list=new ArrayList<String>();
list.add("abc");
return new Runnable() {
@Override
public void run() {
System.out.println(list.get(0));
}
};
}

}
在执行t.start()时候,getRun()这个方法栈已经出栈了,list这个局部变量也已经不存在了,那run()方法中使用的list是从哪里来的呢。通过反编译 TestInnerClass 发现,其实在构造Runnable这个内部类时(暂时命名为a),它在a中重新定义了它需要的外部局部变量的参数,类型为final的。同时包括外部类的引用。然后a中有一个注入上述参数的构造方法。通过这种方式,在调用t.start()的时候,我们还是能拿到list引用。
那为什么Java中要加上一个限制,只能使用final型的局部变量或形参呢?当这个局部变量或形参不使用final修饰时会怎样呢。根据上段的分析,在内部类a中改变的是内部类中定义的变量的值,而外部变量的值并没有改变。因此为了避免这种不符合逻辑的事情发生,局部变量或参数就必须是final修饰的。以确保两个变量的值一样,或它们所指向的对象永远一样。
本文出自 “Eisenhower” 博客,请务必保留此出处http://lxdwolf.blog.51cto.com/3069295/1313510
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐