java要求所有被局部内部类访问的局部变量都是用final修饰是因为:对于普通局部变量他的作用域就是该方法内,当方法结束该局部变量就随之消失;但局部内部类可能产生隐式的“闭包”,闭包将使得局部变量脱离他所在的方法继续存在。请看下面的例子是局部变量脱离他所在的方法继续存在的例子:- class Outter {
-
- public void inerTest(){
- final int b = 23; //定义的局部变量
- class InnerClass{
- public void print(){
- System.out.println("b="+b); //此处将一直可以访问到b局部变量
- }
- }
- InnerClass iner = new InnerClass();
- iner.print();
- }
-
- }
- public class TestInerClass{
- public static void main(String ags[]){
- Outter t = new Outter();
- t.inerTest();
- }
- }
复制代码 由于内部类可能扩大局部变量的作用域,如果这里没有加上final修饰,那么这里的局部变量就可以随时被改变,那样就可能混乱,因此java编译器要求所有被内部类访问的局部变量必须使用final修饰符修饰。 |