[英]Declaring Anonymous Inner class
rb.addActionListener(new ActionEvent(ae) {
public void actionPerformed(ActionEvent ae) {
nowCall(ae);
}
});
其它的辦法
Thread th=new Thread(Runnable r) {
public void run() {
// do something
}
};
// notice the ending of above 2 snippets
看到這兩個我真的很困惑。似乎沒有確切的模式來聲明匿名內部類。
請解釋匿名內部類的語法。
就我所見和測試而言,第二個無效。
更常見的是創建一個新的 Runnable 實現:
Thread th=new Thread(new Runnable() {
@Override
public void run() {
// This implements Runnable.run
}
});
現在你可以覆蓋普通線程的run
方法:
Thread th=new Thread() {
@Override
public void run() {
// This overrides Thread.run
}
};
...但我個人更喜歡在創建線程時單獨指定Runnable
。
現在,您在最后注意到的區別只是表達式是否用作參數(例如,用於addActionListener
方法或Thread(Runnable)
構造函數,或者是否只是直接分配給變量。想想整個new TypeName() { ... }
作為單個表達式,這只是以下之間的區別:
Thread th = expression;
和
Thread th = new Runnable(expression);
區別在於,在第一種情況下,您將其作為參數傳遞給方法,而在第二個示例中,您將其存儲在局部變量中。
因此,您無法真正將兩個示例相互比較。
[...]注意以上 2 個片段的結尾
第一個示例中的尾隨)
只是
rb.addActionListener(
(即,你的兩個例子有不同的結尾,因為一個是作業的右手邊
Thread th = ...
;
另一個是方法調用的參數
...addActionListener( ...
);
創建匿名類的語法很簡單:
new SomeClassOrInterface() {
// implementation goes here
}
正如您所看到的,這就是您的兩個示例的模式。
3.12.3. 匿名類的新語法
我們已經看到了定義和實例化匿名類的語法示例。 我們可以更正式地將該語法表示為:
new class-name ( [ argument-list ] ) { class-body }
或者:
new interface-name () { class-body }
此外,您在第二個示例中有一個錯字。 它可能應該讀取new Thread() { ...
或new Thread(r) { ...
(盡管在后一種情況下不會調用重寫的方法)。
實例化新的匿名類並將對象傳遞給addActionListener
方法。
實例化新的匿名類並將對象分配給局部變量th
他們都是一樣的。 您將匿名類放在聲明之后,分號之前: new ActionEvent(ae)
{class details, methods etc}
;
和
Thread(Runnable r)
{ public void run() { // do something }}
;
在這兩種情況下,您都創建了類的新實例,在第一個示例中將其用作方法的參數,在第二個示例中將其分配給一個變量。
不同之處在於您可以將接口實現為匿名內部類或擴展類。 在你的例子中,兩者都在擴展一個類
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.