匿名内部类的位置

java中有关匿名内部类的一些测试
可以看到匿名内部类不仅可以在方法内部定义,同样可以在成员位置定义。

匿名内部类的访问

可以看到匿名内部类只有在访问方法的局部变量时才需要变量被final修饰,访问类的成员变量时并不需要变量被final修饰。

java中有关匿名内部类的一些测试
原因:局部变量的生命周期和方法一样,当方法进栈执行完毕后会被释放,此时方法的局部变量也会随之释放,而匿名内部类对象可能仍在被使用着(对象存储在堆中),此时匿名内部类对象想要用方法的局部变量是找不到的。java为了解决这个问题,让被匿名内部类对象访问的局部变量要求被final修饰。此时java就会拷贝一份变量给匿名内部类对象,就解决了访问不到变量的问题(我的理解:被final修饰的变量会放在方法区的常量池中,所以匿名内部类对象可以直接去常量池中找到该变量?)。而成员变量的生命周期是和对象一起的,存储在堆中,直到垃圾回收消失。因此匿名内部类对象访的问成员变量不需要final修饰符。

注:从java8开始,只要局部变量事实不变,那么final关键字可以省略。

相关文章: