标签:
之前在使用内部类,对外部局部变量要加final一直不是特别理解,今天心血来潮想要弄个明白。
1 public class Outer { 2 public Parent method() { 3 final int n = 8; 4 5 class Inner extends Parent{ 6 public void show() { 7 System.out.println("number:" + n); 8 } 9 } 10 return new Inner(); 11 } 12 public static void main(String[] args) { 13 Outer o = new Outer(); 14 Parent p = o.method(); 15 p.show(); 16 } 17 } 18 19 class Parent{ 20 public void show() { 21 System.out.println("parent"); 22 } 23 }
首先我在method方法里面定义了一个int类型的变量跟Inner(类名)内部类。然后在Inner里面写了
show()方法引用了n变量,加上了final修饰。然后我返回了Inner对象,注意分析此时method方法
执行完后变量n已经被销毁了。那么n变量又怎么还在呢?难道加上final就会一直驻留在内存中?于
是我上网查final的生命周期,发现不是。然后在一篇技术帖中找到答案。
如果定义一个匿名内部类,并且希望它使用一个在其外部定的对象,那么编译器会要求其参数引用
是final 的。经研究,Java虚拟机的实现方式是,编译器会探测局部内部类中是否有直接使用外部
定义变量的情况,如果有访问就会定义一个同类型的变量,然后在构造 方法中用外部变量给自己
定义的变量赋值。引用至 http://developer.51cto.com/art/200906/128214.htm
标签:
原文地址:http://www.cnblogs.com/luck0318/p/4747486.html