最近看了一道面试题:Static Nested Class 和 Inner Class的不同。

闲着无聊,就把Inner Class里成员内部类、局部内部类、匿名内部类和静态内部类都复习一遍。

在测试内部类访问局部变量的时候发现了很有趣的现象,如下:

public class Outer {

    public void method() {
        int as = 1;
        class Inner
        {
            public void method()
            {
                System.out.println(as);
            }
        }
    }
}

在修改了变量as之后,编译不能通过。

Eclipse提示我这里只能访问final常量或effectively final,effectively final是什么,字面意思是有效常量,我理解为等价常量。

后来查询资料,发现effectively final出现在java8之后,内部类在访问局部变量时,如果该变量可以视为final,即定义后再也未被修改过,系统会将其认为effectively final,等价于final。

总结
java8之前:只能访问外部方法中被final修饰的常量,且不能修改。
java8之后:除了访问常量,还可以防问”effectively final“,即被定义后就没有被更改的变量。

02-11 23:39