谢谢大家,在尝试了下面的代码后,我的疑问得到了解决。
日历 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()); //<--------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 ,但我们可以将子类对象分配给抽象类(即父)引用变量。前任:
抽象类 A{ }
类 B 扩展 A{ }
我们可以说:
A a = new B();
但不是
A a = new A();