使用匿名類的建構函式

2021-07-06 01:55:15 字數 1222 閱讀 6603

閱讀如下**,看看是否可以編譯:

public static void main(string args) ;  

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());  

}

注意arraylist後面的不同點:l1變數後面什麼都沒有,l2後面有一對{},l3後面有2對巢狀的{},這段程式能不能編譯呢?若能編譯,那輸出是多少呢?

答案是能編譯,輸出的是3個false。l1很容易解釋,就是宣告了arraylist的例項物件,那l2和l3代表的是什麼呢?

(1)l2=new arraylist(){}

l2代表的是乙個匿名類的宣告和賦值,它定義了乙個繼承於arraylist的匿名類,只是沒有任何的覆寫方法而已,其**類似於:

//定義乙個繼承arraylist的內部類  

class sub extends arraylist  

//宣告和賦值  

list l2 = new sub(); 

(2) l3=new arraylist()}

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

//定義乙個繼承arraylist的內部類  

class sub extends arraylist  

}  //宣告和賦值  

list l3 = new sub(); 

看到了吧,就是多了乙個初始化塊而已,起到建構函式的功能。我們知道乙個類肯定有乙個建構函式,且建構函式的名稱和類名相同,那問題來了:匿名類的建構函式是什麼呢?它沒有名字呀!很顯然,初始化塊就是它的建構函式。當然,乙個類中的建構函式塊可以是多個,也就是說可以出現如下**:
list l3 = new arraylist(){}{}{}{}}; 

上面的**是正確無誤,沒有任何問題的。現在清楚了:匿名函式雖然沒有名字,但也是可以有建構函式的,它用建構函式塊來代替,那上面的3個輸出就很清楚了:雖然父類相同,但是類還是不同的。

父類,子類,匿名類建構函式

1 子類只繼承父類的預設 預設 建構函式,即無形參建構函式。如果父類沒有預設建構函式,那子類不能從父類繼承到任何建構函式。2 子類從父類處繼承來的父類預設建構函式,不能成為子類的預設建構函式。3 在建立物件時,先呼叫父類預設建構函式對物件進行初始化,然後呼叫子類自身自己定義的建構函式。4 如果子類想...

matlab x 構造匿名函式

參考文獻 function obj rastrigin var,m,opt rastrigin function var design variable vector 決策變數向量 m rotation matrix 旋轉矩陣 opt shift vector 偏移向量 dim length var...

建構函式 匿名類 乙個類分開寫

今天是開學第一天,好多過去學的知識都忘了 t t。今天覆習了建構函式。建構函式必須要記住的幾點 1.建構函式名要與類名完全相同 2.建構函式木有返回值 可以根據他的結構看出來 許可權 類名 木有返回值型別ing。3.建構函式不能被直接呼叫,必須使用new 初始化初始化乙個物件 4.預設的建構函式是沒...