2013-04-29 85 views
3
SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     Example ex = new Example(); 
     ex.setVisible(true); 
    } 
}); 

這裏的一段代碼如下new Runnable()。我如何理解這段代碼?我不記得我們可以直接將代碼塊傳遞給java中的任何對象。在Java中執行新操作後,代碼塊會執行什麼操作?

+0

這實際上是創建一個「在線」類。看到這個問題 - > [內嵌的Java類定義] [1] [1]:http://stackoverflow.com/questions/8913406/java-inline-class-definition – BlakeP 2013-04-29 19:28:37

回答

4

這不是一個代碼塊。這是一個對象。

當你說,

new Runnable() 

要創建實現Runnable接口的對象,特別是run()方法。

正如方法名所示,invokeLater()將在稍後的某個時間點調用可運行接口實現對象(或Runnable對象)的run()方法。

另一個海報提到,這是一個匿名類的例子。這是一種真正便捷的機制,可以以更簡潔的方式快速編寫代碼。如果你不喜歡這個,你能做到這樣 -

創建一個實現Runnable一個新類 -

public class RunnableImplementation implements Runnable 
{ 
    public void run() 
    { 
     Example ex = new Example(); 
     ex.setVisible(true); 
    } 
} 

然後,在您的示例代碼變得 -

SwingUtilities.invokeLater(new RunnableImplementation()); 
+0

你能不能給我更多說明?什麼是對象?可運行?但尚未定義,我們如何才能新的呢?另外,爲什麼我們可以在main中定義一個函數? – OneZero 2013-04-29 19:27:55

+0

@OneZero你不能在該電話之外「新」。它是匿名的。 – 2013-04-29 19:28:52

4

它創建了一個匿名內部類的實例。而不是從Runnable中派生一個命名的類並創建它的一個實例,您可以將所有東西內聯。

參見。

1

您沒有傳遞任何代碼塊,你實際上是重寫Runnable

0

如何理解這段代碼的run方法?這就是所謂的swing event queue,它有助於防止併發問題。它按順序調用此隊列中每個Runnable對象上的方法run()

0

您的代碼

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
    Example ex = new Example(); 
    ex.setVisible(true); 
    } 
}); 

相當於

SwingUtilities.invokeLater(new MyRunnable()); 

其中MyRunnable是實現Runnable接口與你的代碼,並且只用於此目的創建的,無法再次使用的類。

注意MyRunnable不是實際的名稱,只是表明了它的意思。