关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?
2014-07-19 17:06
585 查看
这个问题我碰到过好几次了,也不怎么在意,但是一直不知道真正原因,刚去网上查了下资料,终于知道他的真正原因了。
由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符final可以把变量变为常量,由于变量和常量的生命周期和存储位置不同,所以常量的值是不会被销毁的,即使方法已经退出,知道结果了吧。
这样干说,可能大家都不知道这样有什么意义,可能会想这样的机制在实战中有什么用呢?
举个例子吧:
运行结果:
Hi,Call AnonymousInnerMethod
Hi,Call AnonymousinnerMethod_0
Hi,Call AnonymousinnerMethod_1
看到为什么要这么干了吧,相信大家也经常见到这个所谓的匿名内部类,尤其是Android程序中,就这样了。
由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符final可以把变量变为常量,由于变量和常量的生命周期和存储位置不同,所以常量的值是不会被销毁的,即使方法已经退出,知道结果了吧。
这样干说,可能大家都不知道这样有什么意义,可能会想这样的机制在实战中有什么用呢?
举个例子吧:
package com.example.test; public class AnonymousInnerClass { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub AnonymousInnerClassInterface anonymousSayHi = getAnonymousClassMethod(); anonymousSayHi.AnonymousinnerMethod(); AnonymousInnerClassAbstract anonymousSayHi_ = getAnonymousClassMethod_a(); anonymousSayHi_.AnonymousinnerMethod_0(); anonymousSayHi_.AnonymousinnerMethod_1(); } public static AnonymousInnerClassAbstract getAnonymousClassMethod_a(){ final String hi = "Hi,"; return new AnonymousInnerClassAbstract(){ void AnonymousinnerMethod_0() { // TODO Auto-generated method stub System.out.println(hi+"Call AnonymousinnerMethod_0"); } }; } public static AnonymousInnerClassInterface getAnonymousClassMethod() { // String hi = "Hi,";//这个是错的,原因参考刚才阐述。 final String hi = "Hi,"; return new AnonymousInnerClassInterface() { public void AnonymousinnerMethod() { // TODO Auto-generated method stub System.out.println(hi + "Call AnonymousInnerMethod"); } }; } } // 定义局部内部类的上层接口,用于允许返回匿名内部类 //用abstract class的方式 abstract class AnonymousInnerClassAbstract { String hi = "Hi,"; abstract void AnonymousinnerMethod_0();//这个必须要加abstract,应为默认的不是abstract void AnonymousinnerMethod_1() { System.out.println(hi + "Call AnonymousinnerMethod_1"); } } //用interface的方式 interface AnonymousInnerClassInterface { String hi = "Hi,";//默认的是static final void AnonymousinnerMethod();//默认abstract }
运行结果:
Hi,Call AnonymousInnerMethod
Hi,Call AnonymousinnerMethod_0
Hi,Call AnonymousinnerMethod_1
看到为什么要这么干了吧,相信大家也经常见到这个所谓的匿名内部类,尤其是Android程序中,就这样了。
相关文章推荐
- java学习记录(四):关于匿名内部类和局部内部类只能访问final变量的问题
- Java基础-内部类-为什么局部和匿名内部类只能访问局部final变量
- Java中为什么匿名内部类和局部内部类只能访问final变量?
- 关于java匿名内部类参数为什么要用final修饰的问题
- Java为什么匿名内部类参数引用需要用final进行修饰?
- 为什么Java匿名内部类的方法中用到的局部变量都必须定义为final
- 注意java8中已经没有匿名内部类和局部内部类只能访问final变量的限制了!
- java中内部类访问局部变量的时候,为什么变量必须加上final修饰
- 为什么匿名内部类和局部内部类只能访问final变量
- 为什么匿名内部类只能访问其所在方法中的final类型的局部变量?
- 为什么内部类调用外部变量,外部变量必须用final修饰
- JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- 为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
- 局部内部类访问外部变量为什么需要使用final修饰
- java匿名内部类使用外部变量时,外部变量必须是final,为什么?
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- 为什么Java匿名内部类中的方法参数必须定义为final
- 为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?
- 为什么匿名内部类和局部内部类只能访问final变量