Java中的内部类02-访问其所在方法中的final类型的局部变量
2017-06-10 15:45
253 查看
内部类对象的生命周期会超过局部变量的生命周期。
局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类一样:自创建一个局部内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方法已调用结束,局部变量已死亡,但局部内部类的对象仍然活着。
局部内部类对象可以访问同一个方法中被定义为final类型的局部变量。定义为final后,编译程序的实现方法:对于局部内部类对象要访问的所有final类型局部变量,都拷贝成为该对象中的一个数据成员。这样,即使栈中局部变量已死亡,但被定义为final类型的局部变量的值永远不变,因而局部内部类对象在局部变量死亡后,照样可以访问final类型的局部变量,因为它自己拷贝了一份,且与原局部变量的值始终一致。(同样适用于匿名内部类)
下面代码演示了,外部类中的成员方法结束之后,局部内部类对象还被其他对象引用。
要不要加final就是看局部内部类的外围方法结束后,其参数是不是还要被局部内部类使用,如果还要被使用,则要加final否则就不用加了。
局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。而内部类对象生命周期与其它类一样:自创建一个局部内部类对象,系统为该对象分配内存,直到没有引用变量指向分配给该对象的内存,它才会死亡(被JVM垃圾回收)。所以完全可能出现的一种情况是:成员方法已调用结束,局部变量已死亡,但局部内部类的对象仍然活着。
局部内部类对象可以访问同一个方法中被定义为final类型的局部变量。定义为final后,编译程序的实现方法:对于局部内部类对象要访问的所有final类型局部变量,都拷贝成为该对象中的一个数据成员。这样,即使栈中局部变量已死亡,但被定义为final类型的局部变量的值永远不变,因而局部内部类对象在局部变量死亡后,照样可以访问final类型的局部变量,因为它自己拷贝了一份,且与原局部变量的值始终一致。(同样适用于匿名内部类)
下面代码演示了,外部类中的成员方法结束之后,局部内部类对象还被其他对象引用。
class Outer { public static void main1(String[] args) { Outer out = new Outer(); Object obj = out.method(); } Object method() { final int locvar = 1; class Inner { void displayLocvar() { System.out.println("locvar = " + locvar); } } Object in = new Inner(); return in; } }
要不要加final就是看局部内部类的外围方法结束后,其参数是不是还要被局部内部类使用,如果还要被使用,则要加final否则就不用加了。
相关文章推荐
- Java--局部内部类在访问他所在方法中的局部变量必须用final修饰
- [Java] 匿名内部类访问外部类的局部变量为什么一定得是final类型
- Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释
- 为什么匿名内部类访问当前方法的局部变量必须为final类型
- JAVA匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型
- 关于局部内部类访问所在方法的参数或局部变量为什么必须是final的
- 于java里方法的内部类只能访问被final修饰的局部变量和.
- Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释
- 为什么匿名内部类只能访问其所在方法中的final类型的局部变量?
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- 为什么匿名内部类只能访问其所在方法中的final变量
- 【面试对宝典40题的解释】为什么从内部类中访问局部变量需要被声明为final最终类型
- 方法中的内部类访问方法中的局部变量为什么要加final
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- 【Java】内部类访问的外部变量定义成final (数据保持一致,外部修改后无法通知内部,编译的时候会通过构造方法传进来) Java内部类一般访问不了外部变量
- 为什么匿名内部类只能访问其所在方法中的final变量
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- Java8中 局部内部类访问的局部变量不必用final修饰
- 局部内部类只能访问方法内被final修饰的局部变量
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?