2013-12-20 89 views
1

我正在閱讀教科書,我想知道我們傳遞給該函數的參數是不是原型或類的用戶定義實例。將代碼作爲函數參數傳遞

SwingUtilities.invokeLater(new Runnable() 
{ 
    public void run() { 
     new ButtonDemo(); 
    } 
}); 

我已經瞭解到,它不是那兩個之一。但是它似乎在這裏傳遞了一個用戶定義的構造方法,例如Runnable接口()。看來他們想在稍後運行該線程,但何時?這是合法的,我認爲是這樣,但我從未聽說過我的Java類中有這樣的事情。

+3

[匿名類(HTTP://文檔。 oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html) –

回答

6

這實際上是傳遞實現Runnable接口的匿名內部類的實例。在the Java tutorial閱讀。

+0

哇,那很快。太糟糕了,我還不能接受。 – OnTheFly

+0

它只運行一次?新的ButtonDemo()(創建一個按鈕)只運行一次,但它爲什麼在一個線程中呢? – OnTheFly

+0

runnable不是線程。它是一個有run()方法的對象。並且將它傳遞給SwingUtilities.invokeLater(),以便此run()方法在事件派發線程中執行,因爲所有與swing組件的交互都必須從該線程完成。 –

5

我想知道我們傳遞給該函數的參數是怎麼來的,既不是一個原始類型,也不是一個用戶定義的類實例。

這是一個用戶定義的類的實例。唯一的區別是這個班級沒有名字*

它是一個類的實例,它可以完成一個命名類所能做的大部分事情。除此之外,它可以提供其基類或接口的方法實現,這是用來將「可執行代碼」傳遞給方法的方法。

*至少,不是用戶可見的:Java編譯器的確爲每個匿名類分配了一個內部名稱,通常包含一個美元符號。

0

閱讀關於。這被視爲單獨的類。如果編譯代碼並說文件名是Test.java。通過編譯將有兩個類文件Test.classTest$1.class,如果你有更多的內部類,你將有Test$2.class,Test$3.class等等。

3

內SwingUtilities類的代碼是這樣的

private Runnable runnable; 

private void invoke(){//called at some point from inside the runnable 
    runable.run(); 
} 
public void invokeLater(Runnable runnable){ 
    this.runnable=runnable; 
} 

這些被稱爲回調。

+0

這是介於invokeLater如何工作的過度簡化和不正確之間的某處。實際發生的事情是SwingUtilities僅將呼叫轉發給EventQueue。 EventQueue是一個鏈表,並且調用invokeLater將一個新的InvocationEvent添加到它。 InvocationEvent是EventDispatchThread在事件發生時執行的調用。 – Radiodef

+1

@Radiodef,不知道SwingUtilities究竟發生了什麼,但是如果我不知道回調是如何工作的,上面的代碼將是一個很好的例子,向我展示了它們背後的邏輯。 – SteveL