最近看了一道面试题: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“,即被定义后就没有被更改的变量。