`
utopialxw
  • 浏览: 369720 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

抽象类的newInstance

    博客分类:
  • java
 
阅读更多

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

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

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

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

可以看源码

 public static DocumentBuilderFactory newInstance() {
        try {
            return (DocumentBuilderFactory) FactoryFinder.find(
                /* The default property name according to the JAXP spec */
                "javax.xml.parsers.DocumentBuilderFactory",
                /* The fallback implementation class name */
                "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
        } catch (FactoryFinder.ConfigurationError e) {
            throw new FactoryConfigurationError(e.getException(),
                                                e.getMessage());
        }

    }

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

public class test{	
	public static void main(String[] args) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.newDocument();
		System.out.println(factory);
		System.out.println(builder);
		System.out.println(document);
	}
}

 输出结果为

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的,使用静态方法返回其子类实例的类。这样做一般就是表明它的子类不应该再扩展其他新的方法了,只需要实现这个抽象类声明的方法就够了。比如内部类

public abstract class Abstract {

	public static  Abstract newInstance() {
		return new AbstractImpl();
	}

	public abstract void method(String s);

	protected static class AbstractImpl extends Abstract {

		public void method(String s) {
			System.out.println(s);
		}
	}
	
	public static void main(String [] args){
		Abstract abs=Abstract.newInstance();
		System.out.println(abs);
		abs.method("抽象类的newInstance演示");
	}
}

 
运行结果为

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

分享到:
评论

相关推荐

    抽象类、反射、动态绑定、及接口的使用

    Object obj = clazz.newInstance(); Method method = clazz.getMethod("myMethod", String.class); method.invoke(obj, "Hello, Reflection!"); ``` 这段代码展示了如何使用反射动态地创建`MyClass`的对象并调用`...

    JAVA反射机制的入门代码

    2. **创建对象**:使用`Class`对象的`newInstance()`方法创建类的新实例,前提是该类有无参构造函数。如果类没有公共构造函数,可以使用`Constructor`类的`getDeclaredConstructor()`和`newInstance()`方法。 3. **...

    C# 抽象接口委托反射等技术详解

    抽象类中可以包含抽象方法,也可以不包含抽象方法,但这取决于抽象类的设计目的。通常情况下,抽象类是用来提供一种通用行为的基础,而具体实现则留给子类去完成。接下来详细介绍抽象类的相关特性和抽象方法的使用。...

    反射+抽象工厂模式

    2. 创建对象:通过`Class.newInstance()`创建类的实例,或者使用`Constructor.newInstance()`来指定构造函数参数。 3. 访问字段:`Field`类用于获取和设置类的字段值。 4. 调用方法:`Method`类提供了调用方法的能力...

    细细品味C#(抽象接口委托反射)(转自博客园)

    ### 抽象类与抽象方法 #### 内容详情 **摘要:** 本文主要探讨了C#中的抽象类和抽象方法的基本概念、特性和应用场景。通过解析这些概念,旨在帮助读者更好地理解面向对象编程中多态性的实现方式,并掌握如何在实际...

    Java--工作面试总结.doc

    当一个类继承抽象类时,必须实现所有未被父类实现的抽象方法,或者自身也成为抽象类。与抽象类相比,接口更为抽象,它只包含方法签名,没有方法体。接口可以实现多重继承,一个类可以同时实现多个接口。 对象的声明...

    2018最新Java面试题整理.doc

    例如,`Class.forName("类全名")`用于加载类,`newInstance()`用于创建对象,`getMethod()`、`invoke()`用于调用方法。 以上知识点是Java面试中常见的基础部分,理解和掌握这些内容对于成为一名合格的Java开发者至...

    java_innerclass_instance.rar_innerclass

    - 实现多态:内部类可以作为抽象类或接口的实现,提供多种不同的实现方式。 4. **内部类与匿名内部类**: 匿名内部类是没有名字的内部类,通常用于快速实现一个简单的接口或抽象类。它们可以用于简化代码,特别是...

    JAVA程序员面试题

    - 不能直接创建抽象类的实例,但可以创建一个引用类型为抽象类的变量,并让其指向具体的子类实例。 - 抽象类中可以包含非抽象方法(即已实现的方法),也可以包含抽象方法。抽象方法是在类声明中仅声明方法签名但...

    Aop踩坑!记一次模板类调用注入属性为空的问题.doc

    因为没有接口,所以使用 cglib 代理,生成了目标子类的代理对象,代理对象是通过 objenesis.newInstance(proxyClass, enhancer.getUseCache())构造出来的,所以不存在相关属性。 八、总结 由于 AOP 切面代理的原因...

    2021史上最全最新知识点Java面试题库.docx

    - 抽象类可以有方法实现,可以包含非抽象方法,而接口只能声明方法,不能包含实现。 - 类可以继承一个抽象类,但可以实现多个接口,接口可以继承多个接口。 4. **反射的原理**: - 反射允许程序在运行时检查类的...

    Java动态加载类小实验.pdf

    - `Class.forName(className).newInstance()`:使用`Class.forName(String className)`来动态加载类,并通过`newInstance()`方法创建对象。这里`className`是从XML文件中读取的,根据配置的不同可以加载不同的工厂类...

    java非常基础面试题

    Person person = (Person) clazz.newInstance();` - `clone()`方法:如果类实现了`Cloneable`接口,可以调用`clone()`复制对象。 - 序列化和反序列化:对象序列化成字节流,然后再反序列化为新的对象。 10、**...

    总结java常用API.doc

    Class类提供了许多有用的方法,例如newInstance、getMethod、getField等。ClassLoader是Java的类加载器,负责加载类文件。 6. Java IO系统 Java IO系统提供了多种输入/输出流,例如FileInputStream、...

    JAVA后端开发面试题

    - 反射:通过Class类的newInstance()方法或Constructor类的newInstance()方法动态创建对象。 - clone():如果一个对象实现了Cloneable接口,可以通过调用clone()方法创建对象的副本。 - 反序列化:从磁盘或网络...

    Java面试题

    ** 使用Class类的newInstance()方法或Constructor类的newInstance()方法。 12. **设计模式** - **工厂模式** 提供一个创建对象的接口,使代码更易于维护和扩展。 - **单例模式** 保证一个类只有一个实例,并提供...

    反射(Refection)实现镜像对象封装库.zip

    5. **处理构造器**:`Constructor`类代表类的构造函数,`Constructor.newInstance()`用于创建类的新实例。 6. **泛型处理**:虽然反射不能直接处理泛型类型信息,但可以通过获取类的实际类型参数来间接实现,例如`...

    JAVA面试题汇总.pdf

    - 抽象类可以有构造器、抽象方法和非抽象方法,可以有成员变量。 3. Java 创建对象的几种方式: - 使用 new 关键字调用构造方法。 - 使用反射机制。 - 通过 clone() 方法。 - 通过序列化机制。 4. Java 中的...

Global site tag (gtag.js) - Google Analytics