偶然見到一種初始化方式,感到十分新奇:java
還有其餘集合好比HashMap的初始化:數組
這種方式比起先new出對象,再一條條add,顯得更加簡潔和優雅。一開始沒想通什麼原理,後來查了一下才知道這種方法被稱爲雙大括號初始化(double brace initialization)或者匿名內部類初始化法,其實是一種取巧的方式。app
這裏以ArrayList的例子解釋,首先第一層花括號定義了一個繼承於ArrayList的匿名內部類 (Anonymous Inner Class):測試
第二層花括號其實是這個匿名內部類實例初始化塊 (Instance Initializer Block)(或稱爲非靜態初始化塊):this
咱們經過new獲得這個ArrayList的子類的實例並向上轉型爲ArrayList的引用:spa
下面自定義一個類並使用這種方式初始化:code
(2)當咱們想構造一個數組列表,並將它傳遞到一個方法時,最初的寫法以下:對象
ArrayList<String> friends=new ArrayList<>();繼承
friends.add("tom");ip
friends.add("lin");
invite(friends);
若是不想要寫這個數組列表,可將其做爲一個匿名列表,經過雙括號的方式爲列表添加元素,這樣代碼更爲簡潔。
invite(new ArrayList<String> ()
{
{
add("tom");
add("lin");
}
})
外層「{}」建立了ArrayLIst的一個匿名子類,內層「{}」建立了一個對象構造塊。