为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
2011-12-31 13:39
465 查看
package test.inner_class; public interface MyInterface { public void work(); }
package test.inner_class; public class Test { public static void main(String[] args) { new Test().f("whang"); } private void f(final String username) { new MyInterface() { @Override public void work() { System.err.println(username + " working..."); } }.work(); } }
如上代码,其中Test中的方法f的username变量必须定义为final,否则无法在内部类的work方法中使用。
在《Core Java 8th Editon》里是这么说的: A local variable that is declared final cannot be modified after it has been initialized. Thus, it is guaranteed that the local variable and the copy that is made inside the local class always have the same value.
其实,需要定义为final的,就是为了防止在调用该变量时,该变量的引用被修改,导致出现无法预料的问题。
在编译后,出现了两个class文件,分别是Test.class和Test$1.class,其中Test$1就是我们的内部匿名类,反编译看下这两个文件:
D:\workSpace\Test\bin\test\inner_class>javap -private Test Compiled from "Test.java" public class test.inner_class.Test extends java.lang.Object{ public test.inner_class.Test(); public static void main(java.lang.String[]); private void f(java.lang.String); }
D:\workSpace\Test\bin\test\inner_class>javap -private Test$1 Compiled from "Test.java" class test.inner_class.Test$1 extends java.lang.Object implements test.inner_cla ss.MyInterface{ final test.inner_class.Test this$0; private final java.lang.String val$username; test.inner_class.Test$1(test.inner_class.Test, java.lang.String); public void work(); }
在Test$1中,方法work中使用的局部变量username被作为内部类的一个private的成员变量,并使用构造方法初始化。
相关文章推荐
- 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
- 为什么Java匿名内部类中的方法参数必须定义为final
- 为什么匿名内部类调用的方法内局部变量必须为final
- Java中为什么匿名对象中方法,调用局部变量必须加final呢?
- 为什么匿名内部类调用的方法内局部变量必须为final
- 为什么匿名内部类访问当前方法的局部变量必须为final类型
- 为什么匿名内部类调用的方法内局部变量必须为final
- Java 匿名内部类中的外部引用为什么必须是 final 的?
- 关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量(转)
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- Java--局部内部类在访问他所在方法中的局部变量必须用final修饰
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- [Java] 匿名内部类访问外部类的局部变量为什么一定得是final类型
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- java中内部类访问局部变量为什么要定义局部变量为final
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量