为什么一个抽象类“的DocumentBuilderFactory”允许实例化新的实例(How com

2019-09-02 14:25发布

最近,我一直在使用XML解析器。 这是刚刚开始,我和我设法了解如何使用DOM解析器Java中的类即DocumentBuilderFactoryDocumentBuilder解析XML文档。

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

什么我问自己是怎么来的一个抽象类,如DocumentBuilderFactoryDocumentBuilder ,允许实例化新的实例? 然后在另一个例子中,我看到:

Calendar calendar = Calendar.getInstance();  
System.out.println(calendar.get(Calendar.DATE)); 
  1. 据我所知,你不能实例(换句话说,创建一个对象)的抽象和接口类。 我对么?
  2. 这样做getInstance()newInstancce()方法创建上面的抽象类的实例?

我失去了一些有关使用抽象类和它的新对象?

Answer 1:

该方法是一个抽象工厂方法 ,该方法返回的一个子类 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();

名字肯定的不幸的选择已经引起了混乱。



Answer 2:

这是一个静态的抽象工厂方法 ,它会返回一个亚型DocumentBuilderFactory不是实际实例DocumentBuilderFactory itself.It不喜欢什么我想,你明白:

DocumentBuilderFactory dbf = new DocumentBuilderFactory();

#的DocumentBuilderFactory的newInstance() , 获取一个的DocumentBuilderFactory的新实例。 此静态方法创建一个新的工厂实例。 此方法使用以下查找过程顺序来确定DocumentBuilderFactory实现类加载。

newInstance()将返回的实现类(亚型)的一个实例DocumentBuilderFactory ,这是不抽象和将分配给参考该对象DocumentBuilderFactory参考变量。



Answer 3:

这是一个静态方法。 你可以调用抽象的静态方法(或与此有关的任何类)类,而以实例的引用..



Answer 4:

感谢大家,尝试下面的代码后,我的疑问得到了清除。

日历CLS = Calendar.getInstance();
日期DT =新日期();
的System.out.println(cls.getClass()); // <1 ------
的DocumentBuilderFactory DBLS = DocumentBuilderFactory.newInstance(); 的System.out.println(dbls.getClass()); // <2 ------
的DocumentBuilder分贝= dbls.newDocumentBuilder();
的System.out.println(db.getClass()); // <-------- 3

我看到follwoing输出:

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

一)静态方法“DocumentBuilderFactory.newInstance()”返回称为“DocumentBuilderFactoryImpl”子类型类实例。

B)“DocumentBuilderFactoryImpl”是抽象的“DocumentBuilderFacotory”类的子类,因此不存在问题,如果我放弃:

DocumentBuilderFacotryImpl DBLS = DocumentBuilderFactory.newInstance();
// -----代替给予的DocumentBuilderFactory DBLS = DocumentBuilderFactory.newInstance();

并且同样适用于DocumentBuilderImpl分贝= dbls.newDocumentBuilder();
// ----相反的DocumentBuilder分贝= dbls.bewDocumentBuilder的();

结论:的newInstance(),newDocumentBuilder(),的getInstance()返回子类对象。 虽然抽象类不能创建新的对象,我们可以将子类对象的抽象类(ieparent)引用变量。 例如:

抽象类A {}
B类延伸的{}

我们可以说:

 A a = new B();   

但不是

 A a = new A();


文章来源: How come an abstract class “DocumentBuilderFactory” allowed to instantiate new instance