2012-02-06 119 views
6

我從來沒有遇到過這樣的事情,我不知道這種類型的編碼! 這是什麼? (我敢對Java)這是什麼類型的Java構造函數調用?

DefaultHandler handler = new DefaultHandler() { 

      boolean bfname = false; 
      boolean blname = false; 
      boolean bnname = false; 
      boolean bsalary = false; 

      public void startElement(String uri, String localName,String qName, 
        Attributes attributes) throws SAXException { 

       // code 

      } 

      public void endElement(String uri, String localName, 
        String qName) throws SAXException { 

       // code 

      } 

      public void characters(char ch[], int start, int length) throws SAXException { 

       // code 
     }; 

調用構造函數有一個括號之後(!?),它似乎是有一些方法的重寫。然後括號以分號結尾。構造函數調用後,我從來沒有見過大括號。這是正常的嗎?它怎麼叫?謝謝!

p.s:在Eclipse上,如果我刪除分號,則表示LocalVariableDeclarationStatement錯誤。

回答

5

這是一個anonymous class

當您想創建一個派生自另一個類或接口的類時,匿名類可能很有用,但您不需要在代碼中的任何其他位置使用新的類。

關於匿名類的最優雅的事情之一是,它們允許您在需要的地方準確定義一次性類。另外,匿名類具有簡潔的語法,可以減少代碼中的混亂。

在您的具體情況DefaultHandler類是實現多個接口(EntityResolverDTDHandlerContentHandlerErrorHandler)通過提供無能爲力方法輔助類。這個想法是,你可以從這個類中派生出來並且只覆蓋你需要的特定方法。這可能比直接實現接口要少得多,因爲那樣你就需要爲每個方法提供定義,包括你不打算使用的方法。

5

這是匿名類的定義。 DefaultHandler是一個接口,沒有實現,你只是在創建一個,而創建一個實例。

因爲DefaultHandler是一個它期望實現接口的類的對象的接口。但是如果沒有這樣的類或者你需要一個不同的類,你可以創建一個滿足這個要求的對象,方法是通過實現接口。

+0

我知道一個實現接口的類應該定義接口中聲明的所有方法,我錯了嗎?在我的例子中,只定義了3個方法! – Angelo 2012-02-06 23:00:23

+1

這不是一個接口 - 它是一個類。檢查DefaultHandler的文檔。 – 2012-02-06 23:01:44

+1

你是對的,但'DefaultHandler'可能是一個AbstractClass,在這種情況下,你只需要定義抽象方法 – destan 2012-02-06 23:02:07

4

這是一個匿名的內部類。有一個谷歌'匿名類java'。它基本上是一個通過界面即時創建的類。整個定義被指定爲inline將其視爲'new DefaultHandler()'部分之後的類定義,顯然這個特定的類定義只能在這個地方使用。

1

那是一個匿名類的定義。它基本上是實現Abstract類或擴展類的一種方式。因此,您要麼執行DefaultHandler類,要麼執行DefaultHandler,具體取決於DefaultHandlerabstract類還是具體類。

相關問題