2010-04-21 152 views
8

我對Java如此忍受我,如果這是一個可笑的簡單問題,但我很好奇它有這個方法調用{}代碼正在採取的 - 請參見下面的代碼在方法addSelectionListener一個例子。這樣做的目的是什麼?我一直在尋找解釋的文件,但似乎無法找到這種做法被稱爲不要介意任何有用的信息。這個Java構造是做什麼的?

setStatusLine.addSelectionListener(new SelectionAdapter() { 
     public void widgetSelected(SelectionEvent e) { 

      String message = "I would like to say hello to you."; 
      if (pressed) { 
       message = "Thank you for using me"; 
      } 
      setStatusLine(message); 
      pressed = !pressed; 
     } 
    }); 

感謝能夠提供

+4

匿名類再次罷工!不能真的責怪人們不能找到一些他們不知道的名字的參考... – 2010-04-21 09:14:38

+5

「我新來的java如此裸露在我身邊......」 - 我敢打賭,你說所有的guys :-) – 2010-04-21 09:15:14

+0

當我開始學習Java以及:)時,我掙扎於這些:) – Skurmedel 2010-04-21 09:17:59

回答

7

這是一個Anonymous Class,或匿名內部類的任何幫助或見解。如果你是谷歌,你會發現一些tutorials /例子。太陽has some docs也是。

+0

謝謝你們的幫助,非常感謝。 – BandyOrc 2010-04-21 09:24:25

2

沒有實際上是一個方法調用... 此代碼設置setStatusLine組件上的選擇偵聽器。

此代碼的等效可能是

public class X implements SelectionListener{ 

    //In the constructor or an other method. 
    setStatusLine.addSelectionListener(this); 

    public void widgetSelected(SelectionEvent e) { 

     String message = "I would like to say hello to you."; 
     if (pressed) { 
      message = "Thank you for using me"; 
     } 
     setStatusLine(message); 
     pressed = !pressed; 
    } 

} 
3

方法addSelectionListener接收SelectionListener中實例。它不會收到「代碼」。令人困惑的是使用新的<類/接口名稱>(){...}。這種結構用於anonymous inner classes。實際上什麼上面的代碼沒有被延伸的SelectionAdapter類,覆蓋其widgetSelected方法,創造了新的類的一個實例,並將其傳遞給addSelectionListener()。

匿名內部類的使用與偵聽器很常見,我們在這裏創建一個新類,以用於某個特定的地方。因此我們不給它起一個名字,我們希望直接在使用它的上下文中實現它。

4

由於其他貢獻者已經說了:這是一個匿名類

您可能已經創建了一個名爲McClass.java新文件了名爲MyClass一類新期待這樣的:

class MyClass extends SelectionAdapter { 

    public void widgetSelected(SelectionEvent e) { 
    <your code that's being executed whenever the widget is being selected> 
    } 

} 

然後你可能已經改變了第一行這樣的:

setStatusLine.addSelectionListener(新MyClass的());

請參閱?現在你只有一個「顯式」類,只有一個函數。通常這會造成太多的開銷,並且會讓你的設計混亂。

這是否幫助?

0

我花了一些時間來了解匿名內部類。基本的事情要記住的是:

它們就像參數,除了傳遞一個基本類或對象,你傳遞一個類實現一個接口/擴展一個類(是的,他們也工作與接口)取決於方法參數。 它們是匿名的,所以在方法彈出堆棧後立即「消失」。 });對於一個匿名的內心階層來說,這是一場死亡的棄權。 它們經常在用戶界面中爲偵聽器事件彈出 它們可以節省代碼中的混亂,但也會使其難以閱讀。

對於全處罰讀JLS:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

如果您有興趣瞭解這些事情的細節問題,讀取SCJP書和做考試是好還是可以學習JLS。它不會學習如何編寫代碼,但它可以幫助您瞭解Java以及其他許多OO語言如何工作。