最近,我一直在使用XML解析器。 这是刚刚开始,我和我设法了解如何使用DOM解析器Java中的类即DocumentBuilderFactory
和DocumentBuilder
解析XML文档。
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
什么我问自己是怎么来的一个抽象类,如DocumentBuilderFactory
和DocumentBuilder
,允许实例化新的实例? 然后在另一个例子中,我看到:
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.DATE));
- 据我所知,你不能实例(换句话说,创建一个对象)的抽象和接口类。 我对么?
- 这样做
getInstance()
和newInstancce()
方法创建上面的抽象类的实例?
我失去了一些有关使用抽象类和它的新对象?
该方法是一个抽象工厂方法 ,该方法返回的一个子类 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();
名字肯定的不幸的选择已经引起了混乱。
这是一个静态的抽象工厂方法 ,它会返回一个亚型DocumentBuilderFactory
不是实际实例DocumentBuilderFactory
itself.It不喜欢什么我想,你明白:
DocumentBuilderFactory dbf = new DocumentBuilderFactory();
#的DocumentBuilderFactory的newInstance() , 获取一个的DocumentBuilderFactory的新实例。 此静态方法创建一个新的工厂实例。 此方法使用以下查找过程顺序来确定DocumentBuilderFactory实现类加载。
newInstance()
将返回的实现类(亚型)的一个实例DocumentBuilderFactory
,这是不抽象和将分配给参考该对象DocumentBuilderFactory
参考变量。
这是一个静态方法。 你可以调用抽象的静态方法(或与此有关的任何类)类,而以实例的引用..
感谢大家,尝试下面的代码后,我的疑问得到了清除。
日历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