簡體   English   中英

聲明匿名內部類

[英]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
}

正如您所看到的,這就是您的兩個示例的模式。


來自匿名類(Java in a Nutshell)

3.12.3. 匿名類的新語法

我們已經看到了定義和實例化匿名類的語法示例。 我們可以更正式地將該語法表示為:

 new class-name ( [ argument-list ] ) { class-body }

或者:

 new interface-name () { class-body }

此外,您在第二個示例中有一個錯字。 它可能應該讀取new Thread() { ...new Thread(r) { ... (盡管在后一種情況下不會調用重寫的方法)。

  1. 實例化新的匿名類並將對象傳遞給addActionListener方法。

  2. 實例化新的匿名類並將對象分配給局部變量th

他們都是一樣的。 您將匿名類放在聲明之后,分號之前: new ActionEvent(ae) {class details, methods etc} ;

Thread(Runnable r) { public void run() { // do something }} ;

在這兩種情況下,您都創建了類的新實例,在第一個示例中將其用作方法的參數,在第二個示例中將其分配給一個變量。

不同之處在於您可以將接口實現為匿名內部類或擴展類。 在你的例子中,兩者都在擴展一個類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM