先看看下面的代碼能不能編譯通過:
public static void main(String[] args) {
List l1 = new ArrayList();
List l2 = new ArrayList(){};
List l3 = new ArrayList(){{}};
System.out.PRintln(l1.getClass() == l2.getClass() );
System.out.println(l2.getClass() == l3.getClass() );
System.out.println(l1.getClass() == l3.getClass() );
}
答案是能通過編譯,輸出3個false。l1很容易理解,就是聲明了一個
ArrayList對象,那么l2、l3是什么呢?
l2是一個匿名類內部類對象,繼承ArrayList;
l3語句有些古怪,帶了兩個大括號,其實我們這樣寫就會明白了,這也是一個匿名內部類的定義,它的代碼類似如下:
class Sub extends ArrayList {
{
//初始化代碼塊
}
}
List l3 = new Sub();
看到了吧,就是多了一個初始化代碼塊而已,起到構造函數(shù)的功能。當然一個類中的構造代碼塊可以有多個,下面的代碼是可以編譯的:
List l4 = new ArrayList(){{}{}{}};
匿名內部類雖然可以用一個初始化代碼塊來充當構造函數(shù),但其構造函數(shù)還是進行了特殊的處理,它在初始化時直接調用父類的同參構造函數(shù),然后在調用自己的代碼塊,例如:
List l5 = new ArrayList(5){
{
System.out.println("我是匿名內部類");
}
};
等價于:
class Sub extends ArrayList{
{
System.out.println("我是匿名內部類");
}
Sub(int num){
super(num);
}
}
List l5 = new Sub(5);
新聞熱點
疑難解答