[改善Java代碼]使用匿名類的構造函數

建議39: 使用匿名類的構造函數java

閱讀以下代碼,看看是否能夠編譯:函數

 1 public class Client {
 2     public static void main(String[] args) {  
 3          List l1 = new ArrayList();  
 4          List l2 = new ArrayList(){};  
 5          List l3 = new ArrayList(){{}};  
 6          System.out.println(l1.getClass() == l2.getClass());  
 7          System.out.println(l2.getClass() == l3.getClass());  
 8          System.out.println(l1.getClass() == l3.getClass());  
 9     } 
10 }

 

注意ArrayList後面的不一樣點:l1變量後面什麼都沒有,l2後面有一對{},l3後面有2對嵌套的{},這段程序能不能編譯呢?若能編譯,那輸出是多少呢?spa

答案是能編譯,輸出的是3個false。l1很容易解釋,就是聲明瞭ArrayList的實例對象,那l2和l3表明的是什麼呢?code

(1)l2=new ArrayList(){}對象

l2表明的是一個匿名類的聲明和賦值,它定義了一個繼承於ArrayList的匿名類,只是沒有任何的覆寫方法而已,其代碼相似於:blog

1 //定義一個繼承ArrayList的內部類  
2 class Sub extends ArrayList{  
3 }  
4 //聲明和賦值  
5 List l2 = new Sub(); 

 

(2) l3=new ArrayList(){{}}繼承

這個語句就有點怪了,還帶了兩對大括號,咱們分開來解釋就會明白了,這也是一個匿名類的定義,它的代碼相似於:get

1 //定義一個繼承ArrayList的內部類  
2 class Sub extends ArrayList{  
3      {  
4         //初始化塊  
5      }  
6 }  
7 //聲明和賦值  
8 List l3 = new Sub(); 

看到了吧,就是多了一個初始化塊而已,起到構造函數的功能。咱們知道一個類確定有一個構造函數,且構造函數的名稱和類名相同,那問題來了:匿名類的構造函數是什麼呢?它沒有名字呀!很顯然,初始化塊就是它的構造函數。固然,一個類中的構造函數塊能夠是多個,也就是說能夠出現以下代碼:編譯

1 List l3 = new ArrayList(){{}{}{}{}{}}; 

 

上面的代碼是正確無誤,沒有任何問題的。如今清楚了:匿名函數雖然沒有名字,但也是能夠有構造函數的,它用構造函數塊來代替,那上面的3個輸出就很清楚了:雖然父類相同,可是類仍是不一樣的。 class

 

//===========================================================

若是說分別打印這三個類的輸出結果是:

class java.util.ArrayList
class cn.summerchill.test.Client$1
class cn.summerchill.test.Client$2
相關文章
相關標籤/搜索