你的位置:首页 > ASP.net教程

[ASP.net教程]java内部类,局部变量加Final分析


之前在使用内部类,对外部局部变量要加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