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

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


由于方法中的变量属于当前所在的方法帧,当方法返回的时候方法帧退栈,导致方法中的变量丢失,那么这些匿名的内部类或者局部内部类对该变量的引用就是去了意义,所以通过修饰符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程序中,就这样了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值