Java中抽象类的newInstance

1:看解释器模式,看到下面的代码

Java代码   收藏代码
  1. Document doc = null;  
  2. //建立一个解析器工厂  
  3. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  4. //获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器  
  5. DocumentBuilder builder=factory.newDocumentBuilder();  
  6. //得到一个表示XML文档的Document对象  
  7. doc=builder.parse(filePathName);  
  8. //去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象  
  9. doc.normalize();  

DocumentBuilderFactory为抽象类,抽象类一般是不会去实例化的。

这里的DocumentBuilderFactory.newInstance()是使用了抽象类的static方法去返回一个实例,

可以看源码

Java代码   收藏代码
  1. public static DocumentBuilderFactory newInstance() {  
  2.        try {  
  3.            return (DocumentBuilderFactory) FactoryFinder.find(  
  4.                /* The default property name according to the JAXP spec */  
  5.                "javax.xml.parsers.DocumentBuilderFactory",  
  6.                /* The fallback implementation class name */  
  7.                "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");  
  8.        } catch (FactoryFinder.ConfigurationError e) {  
  9.            throw new FactoryConfigurationError(e.getException(),  
  10.                                                e.getMessage());  
  11.        }  
  12.   
  13.    }  

 这里返回的是FactoryFinder.find,find方法去查找本地的实例类,我们可以通过代码去看下

Java代码   收藏代码
  1. public class test{    
  2.     public static void main(String[] args) throws Exception {  
  3.         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
  4.         DocumentBuilder builder = factory.newDocumentBuilder();  
  5.         Document document = builder.newDocument();  
  6.         System.out.println(factory);  
  7.         System.out.println(builder);  
  8.         System.out.println(document);  
  9.     }  
  10. }  

 输出结果为

com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl@15eb0a9
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl@1a05308
[#document: null]

而DocumentBuilderFactoryImpl则是

    public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory{}

DocumentBuilderImpl则是

    public class DocumentBuilderImpl extends DocumentBuilder implements JAXPConstants{}

都是实例化的子类。

 

2:其实抽象类的newInstance方法一般都定义为static的,使用静态方法返回其子类实例的类。这样做一般就是表明它的子类不应该再扩展其他新的方法了,只需要实现这个抽象类声明的方法就够了。比如内部类

Java代码   收藏代码
  1. public abstract class Abstract {  
  2.   
  3.     public static  Abstract newInstance() {  
  4.         return new AbstractImpl();  
  5.     }  
  6.   
  7.     public abstract void method(String s);  
  8.   
  9.     protected static class AbstractImpl extends Abstract {  
  10.   
  11.         public void method(String s) {  
  12.             System.out.println(s);  
  13.         }  
  14.     }  
  15.       
  16.     public static void main(String [] args){  
  17.         Abstract abs=Abstract.newInstance();  
  18.         System.out.println(abs);  
  19.         abs.method("抽象类的newInstance演示");  
  20.     }  
  21. }  

 
运行结果为

com.lxw.test.Abstract$AbstractImpl@757aef
抽象类的newInstance演示

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值