2011-03-17 119 views
2

我經常遇到這樣的代碼片段:構造函數中的方法?

的invokeLater的一般形式是 - 靜態無效的invokeLater(Runnable接口OBJ

但我經常遇到這些類型的代碼:

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

}

或-----(另一種類型的示例)

{ 
    clean.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent ae) { 
    cleanActionPerformed(ae); 
    } 
}); 

}

這是什麼? 構造函數中有方法!我無法理解寫這些片段的方式。 解釋得非常清楚

+0

的可能重複[事件驅動線程(http://stackoverflow.com/questions/5339025/event-driven-thread) – Bombe 2011-03-17 14:06:07

+0

這是類似於你的其他問題,[這個方法是如何工作的](http://stackoverflow.com/questions/5335161/how-does-this-method-work),以及Bombe指出的你的問題。如果答案沒有意義,請發表評論,要求澄清;不要一直在發表相同的問題 – 2011-03-17 15:02:42

回答

1

你看到的是匿名內部類。他們是一次性課程,你不會在其他地方使用。

看看這片:

clean.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent ae) { 
    cleanActionPerformed(ae); 
    } 
}); 

addActionListener期待一個ActionListener的實現,這是一個接口。

現在,你可以編寫一個全新的類來實現它,然後把它的一個實例作爲參數addActionListener,但是如果你不會使用這種方法,編寫起來會更快(而且難以閱讀)這樣的班級在其他地方。

同樣的效果可能已經實現了這一點:

class SomeActionListener implements ActionListener { 
    public void actionPerformed(ActionEvent ae) { 
     cleanActionPerformed(ae); 
    } 
} 

... 

clean.addActionListener(new SomeActionListener()); 
+0

public void actionPerformed(ActionEvent ae){ cleanActionPerformed(ae); } }); 新的ActionListener()表示什麼? – 2011-03-17 14:39:58

2

他們是匿名類。

可能將它們作爲一個類寫在它們自己的文件中,實例化它並將它作爲參數傳遞......但是對於一次性使用,這是更簡單的方法。

(馬特在評論指出下面,「容易」,因爲你沒有創建的文件和寫出來的類等)

+0

「比較容易」,就像您必須編寫的代碼量一樣;運行時的效果完全相同 – 2011-03-17 14:03:21

+0

@matt - 當然。我將在這個clean.addActionListener(new ActionListener())中編輯並注意 – 2011-03-17 14:04:21

0

這些只是匿名類或沒有名字的本地類。當你只會引用一次類時,通常使用匿名類。

而不是做addListener(this)並讓你的類實現一些接口。