2013-02-21 40 views
4

在查看我從另一位開發人員那裏獲得的代碼時,我遇到了以下代碼片段。Java語法 - 它有什麼作用?

public void myMethod() 
{ 
    final MyClass data1 = new MyClass(1,2,3); 
    final MyClass data2 = new MyClass(4,5,6); 
    // [...] 
    final MyClass dataN = new MyClass(M,O,P); 

    ArrayList<MyClass> list = new ArrayList<MyClass>() 
    { 
     { 
      add(data1); 
      add(data2); 
      // [...] 
      add(dataN); 
     } 
    }; 
} 

其實,我想我知道這個代碼(填充list與定義的數據)的東西,但還沒有我吃驚的結果是如何實現的。 特別我想知道在這種情況下花括號{}的含義。

我知道(想想?),這段代碼很糟糕,我已經重寫了它,但僅僅是爲了好奇 我想知道它到底是什麼。

我的猜測是:

  • 首先對{}是一個匿名對象的創建 - 這是轉換爲ArrayList<MyClass>
  • 第二對{}是 - 我在想 - 類似於靜態初始化,但是對於一個對象。 這可能是某種匿名構造函數?

有人能給我一些見解嗎? (我在哪裏可以找到在Java文檔,例如「語法魔法」?)

+0

沒錯。從原始源複製/粘貼/編輯錯誤:)謝謝指出。 – GeneSys 2013-02-21 12:29:46

+0

'{}'是大括號或花括號,而不是括號'()'https://en.wikipedia.org/wiki/Bracket – 2013-02-21 16:10:26

+0

@SteveKuo謝謝澄清。作爲一名德國母語的人,我不知道這一點,因爲在德國,一切都是「klammer」 - 很高興看到英文更明顯:) – GeneSys 2013-02-21 19:38:41

回答

3

通過第一個paranthesis,您正在創建一個超類ArrayList的annonymous inner子類。第二個括號是例如初始化您的匿名內部類的實例。有關詳細信息,請參閱Doc。有這blog有關實例初始化塊

1

此代碼將無法正常工作有一個括號缺失(或分號,但這樣會導致完全不同的東西。)

final MyClass data1 = new MyClass(1,2,3); 
final MyClass data2 = new MyClass(4,5,6); 
// [...] 
final MyClass dataN = new MyClass(M,O,P); 

ArrayList<MyClass> list = new ArrayList<MyClass>()//here 
{ 
    { 
     add(data1); 
     add(data2); 
     // [...] 
     add(dataN); 
    } 
}; 

而第一個{表示您創建一個擴展ArrayList的新類。下一個{意味着一個匿名塊,簡單地分組你的代碼。編輯:由於這是一個函數外,它將被稱爲創建對象時。

+0

Woops。你是對的,在原始代碼中括號就在那裏。抱歉。編輯問題。 – GeneSys 2013-02-21 12:20:45

+2

這是爲什麼起牀投票?它不回答這個問題。他們要求提供有關語法的文檔。 – 2013-02-21 12:22:19

+0

@Ash Burlaczenko:你現在確實回答了,至少部分。 – 2013-02-21 13:06:55

2
ArrayList<MyClass> list = new ArrayList<MyClass>{  //anonymous of subclass 
    {  //non-static initializer block 
     System.out.prinln("..."); 
    } 
}; 

首先{}new ArrayList<MyClass>之後創建一個新的匿名子類ArrayList的,因爲ArrayList是不是最終的類,你可以做一個很好的解釋。

第二對{}是新子類中的非靜態塊或實例塊。


如果您嘗試Integer int1 = new Integer(10){};這是行不通的,因爲匿名類不能繼承的最後一類Integer

0
{ 
     { 
      add(data1); 
      add(data2); 
      // [...] 
      add(dataN); 
     } 
}; 

這是實例塊,因此創建該ArrayList(列表)的對象後,該代碼段將被執行。在每行的add()方法將被調用和數據將被插入到該ArrayList
這等同於說

ArrayList<MyClass> list = new ArrayList<MyClass>(); 
list.add(data1); 
list.add(data2); 
// [...] 
list.add(dataN); 

正如其他人提及的,doc將解釋實例塊的重要性。
首先調用靜態實例塊,然後調用實例塊,最後調用構造函數。靜態實例塊只被調用一次,而實例塊和構造函數在創建新對象時被調用。

相關問題