2012-10-08 108 views
1

當處理匿名內部類時,我對接口的概念感到困惑。據我所知,你不能實例化JAVA接口,所以下面的語句將有一個編譯錯誤帶接口的匿名類

 ActionListener action = new ActionListener(); // compile error 

,但是當它與匿名類交易發生什麼事?爲什麼它允許使用新的?例如

 JButton button = new JButton("A"); 
    button.addActionListener(new ActionListener(){ //this is fine 
      @Override 
      public void actionPerformed(ActionEvent e){ 

      } 
    }; 

編譯器只是在場景後面創建一個類並實現ActionListener?它是如何工作的 ?

+0

您不需要大喊Java –

回答

5

它允許你創建一個新的匿名類,它實現了ActionListener,因爲你提供了實現,你只是沒有給它一個類名。

+0

那麼我們實際創建了哪個實例呢? – peter

+1

@ user1389813您傳遞給'addActionListener'方法的實例。它並不需要明確聲明的類型,因爲你永遠不會再使用它。編譯器只是填充一些佔位符名稱。它只是通過內聯定義的覆蓋來實現'ActionListener'的類。可以說它是一個「ActionListener」,因爲這就是引用類型。 –

+0

實現ActionListener的新的匿名內部類對象。與匿名內部類,很明顯,你將實現一些接口,所以我覺得實現關鍵字是沒有必要的。 –

1

當您創建一個內部類時,您正在實例化一個實現該接口的匿名類。

在你的情況下,效果是一樣的:public class Foo implements ActionListener

0

您正在創建一個類並實現接口匿名class.you工作可以覆蓋方法或實現匿名內部類的方法時

A a= new A(){ 

       }; 

這裏,是不是指A,但對類的對象,它實現A型的參考變量A誰沒有

1

你定義一個內部類無線網絡的名稱th依次指定的名稱,如1,2,3等。同時您正在用new關鍵字實例化內部類。你不關心內部類的名字,因爲你在匿名使用它。如果你查看你的bin目錄,你會看到每個匿名定義的類文件。例如,如果您在班級中使用匿名班級,Foo,則您將爲您創建Foo.classFoo$1.class。我相信這意味着你可以在以後使用反射實例化更多的匿名類。