关于java为什么在Method中局部内部类或者匿名内部类调用Method中定义的变量要用final修饰?

来源:互联网 发布:近年物流业发展数据 编辑:程序博客网 时间:2024/06/05 06:56

这个问题我碰到过好几次了,也不怎么在意,但是一直不知道真正原因,刚去网上查了下资料,终于知道他的真正原因了。


由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符final可以把变量变为常量,由于变量和常量的生命周期和存储位置不同,所以常量的值是不会被销毁的,即使方法已经退出,知道结果了吧。

这样干说,可能大家都不知道这样有什么意义,可能会想这样的机制在实战中有什么用呢?

举个例子吧:

package com.example.test;public class AnonymousInnerClass {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubAnonymousInnerClassInterface 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 stubSystem.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 stubSystem.out.println(hi + "Call  AnonymousInnerMethod");}};}}// 定义局部内部类的上层接口,用于允许返回匿名内部类//用abstract class的方式abstract class AnonymousInnerClassAbstract {String hi = "Hi,"; abstract void AnonymousinnerMethod_0();//这个必须要加abstract,应为默认的不是abstractvoid AnonymousinnerMethod_1() {System.out.println(hi + "Call AnonymousinnerMethod_1");}}//用interface的方式interface AnonymousInnerClassInterface {String hi = "Hi,";//默认的是static finalvoid AnonymousinnerMethod();//默认abstract}

运行结果:

Hi,Call  AnonymousInnerMethod
Hi,Call AnonymousinnerMethod_0
Hi,Call AnonymousinnerMethod_1

看到为什么要这么干了吧,相信大家也经常见到这个所谓的匿名内部类,尤其是Android程序中,就这样了。

0 0
原创粉丝点击