2013-05-11 5 views
5

をインスタンス化することができどうして、私はXMLパーサで取り組んできました。これは私だけのために始めていると私は、XML文書を解析するためにJavaで、すなわちDocumentBuilderFactoryDocumentBuilderをDOMパーサクラスを使用する方法を理解するために管理しました。抽象クラス「のDocumentBuilderFactoryは」最近新しいインスタンス

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

私自身は、このようなDocumentBuilderFactoryDocumentBuilderとして、新しいインスタンスをインスタンス化するために許可され、どのように抽象クラスを来ている求めていますか?そして、私が見る別の例では:私の知る限りでは

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

私は抽象クラスとその新しいオブジェクトの使用についての何かが足りないのですか?

答えて

9

方法は、(コンクリート)の実装であるサブクラスDocumentBuilderを返しabstract factory methodであること。

オブジェクトの正確なクラスは重要ではありませんが、それはDocumentBuilderであることがわかります。このメソッドは、実行時に決定されたインスタンスを返すか、または適切であると判断されたインスタンスを返します。方法newInstance()Classの同じ名前のメソッドと混同しないことを

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

注:あなたが知って興味があれば

は、あなたが実際にこのようなクラスをプリントアウトすることができますつまり、これらの2つは異なります。

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

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

混乱の原因となったことは間違いありません。

+0

私が持っています私の質問に少し追加。 – MKod

+0

@Bohemianちょっと待ってください。DocumentBuilderFactoryクラスは、newDocumentBuilderのようなメソッドを公開して他のオブジェクトインスタンスを返すので、確かにAbstractFactoryとして見ることができます。しかし、DocumentBuilderFactory.newInstance()は多かれ少なかれ静的ファクトリメソッド –

+0

です。私はそれを得ました、私はソースを見ました。助けてくれてありがとう。 – MKod

3

DocumentBuilderFactory itself.Itの実際のインスタンスは、あなたが理解し、私が推測何を好きではないされていないDocumentBuilderFactoryのサブタイプを返します静的抽象ファクトリメソッド、次のとおりです。

DocumentBuilderFactory dbf = new DocumentBuilderFactory(); 

DocumentBuilderFactory#newInstance()DocumentBuilderFactoryの新しいインスタンスを取得します。この静的メソッドは、新しいファクトリインスタンスを作成します。このメソッドは、次の順序付けられた参照プロシージャを使用して、ロードするDocumentBuilderFactory実装クラスを決定します。

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

+0

まさに私は仮定しています:DocumentBuilderFactory dbf = new DocumentBuilderFactory(); 。 「サブタイプを返す」と言うと、サブタイプクラスを知りたい。申し訳ありませんが、私はほとんどそこにいますが、私の思考以上の熟練はありません。 – MKod

+0

いいえ、ソースコードを調べてください! – NINCOMPOOP

+0

私はそれを人にした、私はソースに見てきました。助けてくれてありがとう。 – MKod

1

これは静的メソッドです。インスタンスへの参照を持たない抽象クラス(またはそのクラスの任意のクラス)の静的メソッドを呼び出すことができます。皆のための

+0

非常にtrue.thanks Dev – MKod

1

おかげで、コードの下にしようとした後、私の疑問をクリアしました。

カレンダーCLS = Calendar.getInstance();
日付dt = new Date();
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()); 「DocumentBuilderFactoryImpl呼ば

a)の静的メソッド "DocumentBuilderFactory.newInstance()" を返すサブタイプクラスのインスタンス:// < -------- 3

は、と私はfollwoing出力を参照してください"

b)は "DocumentBuilderFactoryImplは" 抽象 "DocumentBuilderFacotory" クラスのサブクラスであり、それゆえ私は与えれば問題はない。

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

と同じことがDocumentBuilderImpl DB = dbls.newDocumentBuilder()に適用されます。
// ---- DocumentBuilderの代わりにdb = dbls.bewDocumentBuilder();

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

抽象クラスA { }
クラスBは{ }

を拡張し、我々が言うことができます。

A a = new B(); 

なく

A a = new A(); 
+0

はい、私はあなたがそれを理解したと思います。 – Bohemian

+0

+1、それを理解するために!!!! – NINCOMPOOP

関連する問題