2014-10-27 67 views
-1

因此,當查看lambda表達式並使用它們替換Java中的EventHandler的匿名內部類時,我遇到了一些讓我停下來思考的匿名內部類。例如,寫的東西,一個匿名內部類,通常實現的ActionListener當我們寫在Java中使用接口的匿名內部類

myJButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     //DO SOMETHING 
    } 
}); 

我與這個混淆,是ActionListener的,所以我覺得這一定有必要做類似的接口...

myJButton.addActionListener(new myButtonListener implements ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     //DO SOMETHING 
    } 
}); 

但這甚至沒有編譯。我想我的原因,雖然這是很明顯,如果不是我們使用私有內部類,我們使用

private MyButtonListener implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     //DO SOMETHING 
    } 
} 
myJButton.addActionListener(new MyButtonListener()); 

所以我的問題是:

1)爲什麼我們能夠直接從創建一個匿名內部類一個接口,而不是必須通過實現接口的類來創建一個接口?

2)爲什麼我無法創建一個實現ActionListener的匿名內部類,而不是直接從它創建,如我在第二個代碼片段中顯示的那樣?

在此先感謝您的回覆!

+3

您認爲_anonymous_在這裏表示什麼? – 2014-10-27 05:30:27

回答

0

1)我們爲什麼能夠創造從 接口的匿名內部類直接,而不是創建一個通過類 實現接口?

2)爲什麼我無法創建一個匿名的內部類實現 ActionListener而不是直接從它,因爲我在我的第二個代碼 代碼片段顯示?

當您使用implements XXXX一類,你要定義一個類(內或非內),你將不得不給它一個名字,相信我們可以做到這一點,這是我們經常做。雖然匿名內部類沒有名稱,但它更像是一個表達。


我複製這個從http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

而且我認爲這將有助於你理解匿名類是什麼。

匿名類是一個表達式。他們就像本地班,除了他們沒有名字

。匿名類表達式的語法就像構造函數的調用一樣,除了在代碼塊中包含類定義之外。

考慮frenchGreeting對象的實例化:

HelloWorld frenchGreeting = new HelloWorld() { 
     String name = "tout le monde"; 
     public void greet() { 
      greetSomeone("tout le monde"); 
     } 
     public void greetSomeone(String someone) { 
      name = someone; 
      System.out.println("Salut " + name); 
     } 
    }; 

匿名類表達式由以下部分組成:

  • 的新的運營商

  • 到接口的名稱實施或擴大課程。在這個例子中,匿名類正在實現接口HelloWorld。

  • 圓括號包含構造函數的參數,就像普通的類實例創建表達式一樣。注意:當你實現一個接口時,沒有構造函數,所以你使用一對空括號,就像這個例子。

  • 身體,這是一個類聲明的主體。更具體地說,在主體中,方法聲明是允許的,但聲明不是。

因爲匿名類定義是一個表達式,它必須是語句的一部分。在這個例子中,匿名類表達式是實例化frenchGreeting對象的語句的一部分。 (這解釋了爲什麼在右大括號後面有一個分號。)