您的位置:首页 > 编程语言 > Java开发

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

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

由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符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程序中,就这样了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐