2012-02-06 7 views
6

私はこのようなことに遭遇したことがなく、私はこのタイプのコーディングを知らない! これはなんですか?コンストラクタはブレースがある呼び出した後これはどのタイプの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 
     }; 

(Iは、Javaにはかなり新しいです)(!?)、いくつかのメソッドのオーバーライドがあるようです。次に、ブレースはセミコロンで終了します。私はコンストラクタコールの後にブレースを見たことがない。それは普通ですか?それはどのように呼び出されますか?ありがとうございました!

p.s:Eclipseでは、セミコロンを削除すると、LocalVariableDeclarationStatementというエラーが表示されます。

答えて

5

これはanonymous classです。

匿名クラスは、別のクラスまたはインターフェイスから派生したクラスを作成する場合に便利ですが、コード内のどこにでも新しいクラスを使用する必要はありません。

匿名クラスの最もエレガントなことの1つは、必要な場所でワンショットクラスを正確に定義できることです。さらに、匿名クラスは、コード内の混乱を軽減する簡潔な構文を持っています。あなたの特定のケースで

DefaultHandlerクラスは、何もしない方法を提供することにより、複数のインターフェース(EntityResolverDTDHandlerContentHandlerErrorHandler)を実装するヘルパークラスです。このクラスから派生し、必要な特定のメソッドのみをオーバーライドすることができます。これは、インターフェイスを直接実装するよりもはるかに少ないコードになる可能性があります。これは、使用しないメソッドを含むすべてのメソッドの定義を提供する必要があるためです。

5

これは匿名クラス定義です。 DefaultHandlerはインターフェイスで実装されておらず、インスタンスを作成している間にインスタンスを作成しています。

DefaultHandlerは、インタフェースであるため、DefaultHandlerインタフェースを実装するクラスのオブジェクトが必要です。しかし、そのようなクラスがない場合や、別のクラスが必要な場合は、外出先でインターフェイスを実装することによって、この要件を満たすオブジェクトを作成できます。

+0

私は、インターフェイスを実装するクラスは、インターフェイスで宣言されたすべてのメソッドを定義する必要があることを知っていました。私の例では、3つのメソッドしか定義されていません! – Angelo

+1

これはインターフェイスではなく、クラスです。 DefaultHandlerのドキュメントをチェックしてください。 –

+1

あなたは正しいですが、 'DefaultHandler'はAbstractClassかもしれず、その場合抽象メソッド – destan

4

匿名の内部クラスです。 '匿名クラスのJava'のためのGoogleを持っています。これは、基本的に、インターフェイスから即座に作成されるクラスです。定義全体がインラインで指定されているのは、 'new DefaultHandler()'の後にクラス定義として考えることは明らかです。この特定のクラス定義はこの場所でのみ使用できます。

1

それは匿名クラスの定義です。基本的には、抽象クラスを実装したり、クラスを拡張する方法です。したがって、DefaultHandlerクラスを実装するか、DefaultHandlerabstractクラスか具体クラスかによって、DefaultHandlerextendに実装しています。

関連する問題