有人可以向我解釋這個Java語法嗎? 這些括號在外部圓括號內是什麼?有人可以向我解釋這個Java語法嗎?
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
有人可以向我解釋這個Java語法嗎? 這些括號在外部圓括號內是什麼?有人可以向我解釋這個Java語法嗎?
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
這就是所謂的匿名內部類。它創建一個未命名的類,它擴展了WindowAdapter
(它也可以指定一個接口,在這種情況下類將實現該接口),並創建該類的一個實例。在括號內,你必須實現所有的抽象方法或所有的接口方法,你也可以重寫方法。
這是一個anonymous inner class - 括號表示類聲明的開始和結束。這是潛在的useful SO question和bunch of others。
,補充andersoj的回答,你通常當一個方法需要X的一個實例,但X是一個抽象類或接口中使用它們。
在這裏,你實際上是從創建WindowAdapter的派生類,並重寫的方法之一做了具體的任務。
這句法是事件處理程序/接收器非常普遍。
它是一個匿名內部類。這只是一條捷徑。你能想象的代碼會是什麼樣子,如果你需要將其創建爲頂層類:
class CloseApplicationWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
然後,你的代碼中,你會怎麼做:
CloseApplicationWindowAdapter adapter = new CloseApplicationWindowAdapter();
addWindowListener(adapter);
兩種解決方案都具有完全相同的效果(例如,匿名課程會創建一個Class$1.class
文件)。如果匿名類沒有太大/複雜/重要,Java程序員通常更喜歡匿名類方法。
@ e2e8在這種情況下,效果是,代替執行'windowClosing'在外部類或單獨命名的類,你只需要使用一個匿名內部類。 這樣,您的類不必實現'WindowListener'接口或擴展'WindowAdapter'抽象適配器類,也不必創建一個全新的類來接收windowClosing事件。 – tiago2014 2011-02-27 06:10:30
@tiagoinu:+1用於添加我忘記的內容,即匿名內部類的_purpose_。 :-) – 2011-02-27 06:12:00