2013-05-11 103 views
5

最近,我一直在使用XML解析器。這只是我的開始,我設法瞭解如何在java中使用DOM解析器類,即DocumentBuilderFactoryDocumentBuilder來解析XML文檔。如何讓抽象類「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

該方法是abstract factory method,其返回DocumentBuilder子類,這是一個(具體的)實現。

該對象的確切類別知道並不重要,您只需要知道它是一個DocumentBuilder。該方法可以返回在運行時確定的實例,或者它認爲合適的預定實例。

如果你想知道,你可以打印出實際的階級是這樣的:

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

注意,方法newInstance()不是與Class相同名稱的方法混淆,即這兩個是不同的:

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

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

一個不幸的選擇名稱一定會造成混淆。

+0

我有我的問題增加了一些額外的東西。 – MKod 2013-05-11 07:10:19

+0

@Bohemian只是好奇..類DocumentBuilderFactory當然可以被看作AbstractFactory,因爲它公開像newDocumentBuilder這樣的方法來返回其他對象實例。然而,DocumentBuilderFactory.newInstance()或多或少是一個靜態工廠方法 – 2013-05-11 07:38:49

+0

我明白了,我查看了源代碼。謝謝您的幫助。 – MKod 2013-05-11 07:48:32

3

這是一個靜態抽象工廠方法,將返回的DocumentBuilderFactory亞型不是DocumentBuilderFactory實際實例itself.It不喜歡什麼我想,你明白:

DocumentBuilderFactory dbf = new DocumentBuilderFactory(); 

DocumentBuilderFactory#newInstance()獲取DocumentBuilderFactory的新實例。這個靜態方法創建一個新的工廠實例。此方法使用以下有序查找過程來確定要加載的DocumentBuilderFactory實現類。

newInstance()將返回的DocumentBuilderFactory實現類(亞型),這是不抽象和將分配給參考該對象 DocumentBuilderFactory參考變量的實例。

+0

正是我假設:DocumentBuilderFactory dbf = new DocumentBuilderFactory(); 。當你說「它會返回子類型」時,我喜歡知道子類。對不起,我差不多在那裏,但微妙的是我的想法。 – MKod 2013-05-11 07:30:46

+0

不,不是,請通過源代碼! – NINCOMPOOP 2013-05-11 07:31:21

+0

我懂了,我已經看過源代碼。謝謝您的幫助。 – MKod 2013-05-11 07:47:35

1

這是一種靜態方法。你可以調用靜態方法的抽象(或任何類的事情)類沒有參考實例..

+0

非常真實。感謝Dev – MKod 2013-05-12 15:17:53

1

感謝大家,在嘗試下面的代碼後,我的懷疑被清除了。

日曆cls = Calendar.getInstance();
Date 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()); // < -------- 3

我看到follwoing輸出:

一個)靜態方法 「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()返回子類對象。雖然抽象類不能創建新對象,但我們可以將子類對象分配給抽象類(即父類)引用變量。例如:

抽象類A { }
類B擴展A { }

,我們可以說:

A a = new B(); 

但不

A a = new A(); 
+0

是的,我想你已經想通了。 – Bohemian 2013-05-12 12:42:41

+0

+1,找出它! – NINCOMPOOP 2013-05-12 14:54:30