Java方法内部类为什么需要方法形参或变量是final的?
2013-10-22 18:06
399 查看
局部内部类
即定义在方法中的内部类。由于本身就在方法内部(可出现在形参定义处或方法体处),因而,访问方法中的局部变量或形参是很正常的事情。
局部变量的生命周期与局部内部类的生命周期可能不一致。先看下面的示例代码
那为什么Java中要加上一个限制,只能使用final型的局部变量或形参呢?当这个局部变量或形参不使用final修饰时会怎样呢。根据上段的分析,在内部类a中改变的是内部类中定义的变量的值,而外部变量的值并没有改变。因此为了避免这种不符合逻辑的事情发生,局部变量或参数就必须是final修饰的。以确保两个变量的值一样,或它们所指向的对象永远一样。
本文出自 “Eisenhower” 博客,请务必保留此出处http://lxdwolf.blog.51cto.com/3069295/1313510
即定义在方法中的内部类。由于本身就在方法内部(可出现在形参定义处或方法体处),因而,访问方法中的局部变量或形参是很正常的事情。
局部变量的生命周期与局部内部类的生命周期可能不一致。先看下面的示例代码
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
相关文章推荐
- Cannot refer to the non-final local variable user defined in an enclosing scope 内部类定义在方法内,方法定义的参数(形参)无法被内部类直接访问,需要用final定义
- java提高篇(十)-----详解匿名内部类 ,形参为什么要用final
- Java中为什么匿名内部类和局部内部类只能访问final变量?
- Java为什么匿名内部类参数引用需要用final进行修饰?
- 关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- java 匿名内部类的方法参数需要final吗?
- 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
- 局部内部类为什么访问方法中的局部变量时局部变量要加final
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- 为什么匿名内部类只能访问其所在方法中的final类型的局部变量?
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- JAVA匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型
- java提高篇(十)-----详解匿名内部类 ,形参为什么要用final
- 为什么匿名内部类只能访问其所在方法中的final变量
- 为什么Java匿名内部类中的方法参数必须定义为final
- 为什么匿名内部类只能访问其所在方法中的final变量
- Java中内部类中使用外面变量为什么final修饰?
- 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
- Java基础-内部类-为什么局部和匿名内部类只能访问局部final变量