這個問題我碰到過好幾次了,也不怎麼在意,但是一直不知道真正原因,剛去網上查了下資料,終於知道他的真正原因了。
由於方法中的變量屬於當前所在的方法幀,當方法返回的時候方法幀退棧,導致方法中的變量丟失,那麼這些匿名的內部類或者局部內部類對該變量的引用就是去了意義,所以通過修飾符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程序中,就這樣了。