2012-09-08 75 views
3

我正在學習java swing,並且遇到了匿名內部類的概念。在研究了一下這個link後,我覺得匿名內部類必須總是擴展一些其他的類,因爲它作爲參數傳遞的方法是預定義的。至多,如果一個方法接受Object實例作爲參數,那麼我們只能創建一個匿名的獨立內部類。我只是尋求你的意見,我是否正確。如果你能提供一些例子,這將是有幫助的。 在此先感謝。匿名內部類必須擴展一些超類?

+0

所以我得到的是匿名內部類只能是用於覆蓋其超類的方法。 –

回答

1

創建匿名內部類而不擴展任何內容基本上意味着你沒有辦法與之交談。

您需要擴展一個類或實現一個接口,以便爲您的對象提供已知的方法進行交談,例如;

myButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) 
    { 
     // do something here. 
    } 
}); 

去跟那個對象的實例的唯一方法是通過已知的ActionListener方法(這恰好是完全addActionListener方法,需要的方法),你會添加任何其他的方法就只能是訪問對象本身。如果你不需要擴展/實現任何東西,任何方法都不能從外部訪問。

2

內部類的目的是以可以從其他地方使用的方式「打包」操作的實現。當您將一段代碼傳遞給一個可以將控制權交還給您的方法時,您可以實現回調的概念。

基類/接口用於爲該段代碼提供訪問點。您和您調用的方法通過同意接口的內容(實際上是任何類)必須實現的目標方法才能夠回撥您的回調方法的名稱和簽名達成一致。

更具體地說,爲了讓窗口回調窗口監聽器,您必須同意windowClosing方法的名稱和簽名。你通過實現一個接口來做到這一點。

在極少數情況下,當目標方法由java.lang.Object(例如toString)執行時,您可以從頂級Object派生您的命名或匿名內部類。

3

每個類必須擴展一些超類。 只有例外是java.lang.Object,這是頂級的,因此不能有有超類。匿名內部類在這方面沒有什麼不同。

0

你是對你的說法,即類,通過它你讓匿名內部類 繼承該類自動在這種情況下,匿名類繼承C類

class C 
{ 
void one() 
{ 
System.out.println("***************************\n********"); 

} 
} 
class three 
{ 
public static void main(String args[]) 

{ 
C obj=new C(){ 
      void one() 
      { 
      System.out.println("//////////////"); 
       } 
      }; 
obj.one(); 

} 

}