为什么抽象类"DocumentBuilderFactory"允许实例化新实例

MKo*_*Kod 5 java oop abstract-class instantiation

最近,我一直在使用XML解析器.这只是我的开始,我设法了解如何在java中使用DOM解析器类,DocumentBuilderFactoryDocumentBuilder解析XML文档.

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
DocumentBuilder db = dbf.newDocumentBuilder();            
Run Code Online (Sandbox Code Playgroud)

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

Calendar calendar = Calendar.getInstance();  
System.out.println(calendar.get(Calendar.DATE)); 
Run Code Online (Sandbox Code Playgroud)
  1. 据我所知,你不能为抽象和接口类实例化(换句话说,创建一个对象).我对么?
  2. do getInstance()newInstancce()方法是否创建了上述抽象类的实例?

我是否遗漏了使用抽象类及其新对象的内容?

Boh*_*ian 9

该方法是一个抽象工厂方法,它返回一个子类DocumentBuilder,它是一种(混凝土)执行.

对象的确切类别并不重要,您只需要知道它是一个DocumentBuilder.该方法可以返回在运行时决定的实例,或者在其认为合适时预先确定的实例.

如果你很想知道,你可以打印出这样的实际课程:

 System.out.println(dbf.getClass());
Run Code Online (Sandbox Code Playgroud)

请注意,newInstance()不要将该方法与同名方法混淆Class,即这两种方法不同:

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

// an instance method of Class
 DocumentBuilderFactory.class.newInstance();
Run Code Online (Sandbox Code Playgroud)

一个不幸的名字选择肯定会造成混乱.