關於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程序中,就這樣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章