5

最近、私は XML パーサーを扱っています。これは私にとってはまだ始まったばかりで、Java ie で DOM パーサー クラスを使用する方法と、XML ドキュメントを解析する方法を理解することができましDocumentBuilderFactoryDocumentBuilder

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
DocumentBuilder db = dbf.newDocumentBuilder();            

私が自問しているのは、 や などの抽象クラスDocumentBuilderFactoryDocumentBuilder新しいインスタンスをインスタンス化できるのはなぜですか? そして、別の例では次のように表示されます。

Calendar calendar = Calendar.getInstance();  
System.out.println(calendar.get(Calendar.DATE)); 
  1. 私の知る限り、抽象クラスとインターフェイス クラスのインスタンス化 (つまり、オブジェクトの作成) はできません。私は正しいですか?
  2. getInstance()メソッドとnewInstancce()メソッドは、上記の抽象クラスのインスタンスを作成しますか?

抽象クラスとその新しいオブジェクトの使用について何か不足していますか?

4

4 に答える 4

9

そのメソッドは、(具体的な) 実装であるのサブクラスを返す抽象ファクトリ メソッドです。DocumentBuilder

オブジェクトの正確なクラスを知ることは重要ではなく、それがDocumentBuilder. このメソッドは、実行時に決定されたインスタンス、または適切と思われる事前定義されたインスタンスを返す場合があります。

知りたい場合は、次のように実際のクラスを印刷できます。

 System.out.println(dbf.getClass());

newInstance()このメソッドを の同じ名前のメソッドと混同しないように注意してくださいClass。つまり、これら 2 つは異なるものです。

 // a static method of this class
 DocumentBuilderFactory.newInstance(); 

// an instance method of Class
 DocumentBuilderFactory.class.newInstance();

名前の不運な選択は確かに混乱を引き起こしました.

于 2013-05-11T07:07:24.007 に答える
3

これは静的抽象ファクトリ メソッドであり、それ自体DocumentBuilderFactoryの実際のインスタンスではないサブタイプを返します。DocumentBuilderFactory

DocumentBuilderFactory dbf = new DocumentBuilderFactory();

DocumentBuilderFactory#newInstance()DocumentBuilderFactory の新しいインスタンスを取得します。この静的メソッドは、新しいファクトリ インスタンスを作成します。このメソッドは、次の順序付きルックアップ手順を使用して、ロードする DocumentBuilderFactory 実装クラスを決定します。

newInstance()の実装クラス(サブタイプ)のインスタンスを返しますDocumentBuilderFactory。これは抽象ではなく、そのオブジェクトへの 参照をDocumentBuilderFactory参照変数に割り当てます。

于 2013-05-11T07:08:21.530 に答える
1

静的メソッドです。インスタンスへの参照なしで、抽象クラス(またはそのことについては任意のクラス)クラスの静的メソッドを呼び出すことができます..

于 2013-05-11T07:09:47.280 に答える
1

以下のコードを試した後、私の疑問は解消されました。

カレンダー cls = Calendar.getInstance();
日付 dt = 新しい日付 ();
System.out.println(cls.getClass()); //<------ 1
DocumentBuilderFactory dbls = DocumentBuilderFactory.newInstance(); System.out.println(dbls.getClass()); //<------2
DocumentBuilder db = dbls.newDocumentBuilder();
System.out.println(db.getClass()); //<--------3

そして、次の出力が表示されます。

 ********Output******
   class java.util.GregorianCalendar
   class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
   class com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl

a) 静的メソッド "DocumentBuilderFactory.newInstance()" は、"DocumentBuilderFactoryImpl" というサブタイプ クラス インスタンスを返します。

b)「DocumentBuilderFactoryImpl」は抽象「DocumentBuilderFacotory」クラスのサブクラスであるため、次のようにしても問題ありません。

DocumentBuilderFacotryImpl dbls = DocumentBuilderFactory.newInstance();
//----- DocumentBuilderFactory を与える代わりに dbls = DocumentBuilderFactory.newInstance();

DocumentBuilderImpl db = dbls.newDocumentBuilder(); にも同じことが当てはまります。
//---- DocumentBuilder の代わりに db = dbls.bewDocumentBuilder();

結論: newInstance()、newDocumentBuilder()、getInstance() はサブクラス オブジェクトを返します。抽象クラスは新しい Object を作成できませんが、サブクラス オブジェクトを抽象クラス (ieparent) 参照変数に割り当てることができます。元:

抽象クラス A{ }
クラス B は A{ } を拡張します

言うことが出来る:

 A a = new B();   

だがしかし

 A a = new A();
于 2013-05-12T12:05:52.750 に答える