前提:----局部内部类或匿名内部类调用了它们所在的方法中的局部变量----,在初始化这些类时,会创建一块空间来存放这个局部变量的副本 (这个副本呢可以说是copy原有的变量得来的,具有原有变量的所有性质) 这里可以看作是方法传参的方式。对于一般数据类型而言,只是值传递,没有什么问题。
但是对于引用类型而言问题可就大了。要知道java中,销毁一个对象需要具有一定的条件,所以说,这些类的生命周期是可以比它们所属的方法要长的。当这个方法调用结束后,相关的栈空间会被释放,那个局部变量也会被销毁。
问题来了!如果局部内部类或匿名内部类中的那个副本是引用类型的话 ,且被类使用过程中指向没有改变的话。这些类就可能会在后续的访问这个副本的过程中导致-----访问了一个不存在的数据(已经被销毁了)。
所以为了防止这个问题,Java设计者设计为:局部内部类与匿名内部类只能访问final修饰的局部变量或effectively final修饰的局部变量(在Java 8及之后的版本中,如果局部变量被隐式赋予了"effectively final"的特性(即在初始化后未再修改它的值),则可以省略将其显式声明为final。这是因为编译器会自动为那些满足"effectively final"特性的局部变量添加final修饰符)。因为final所修饰的引用类型,不能改变所指向的内容,所以这个存放在内存中的内容是不会被销毁的。
注意一点是:(不同于其它副本,局部内部类与匿名内部类中的局部变量的副本不会随局部变量的销毁而销毁)
不正确,欢迎指出!!