先说不同:
- 1, newInstance() 效率慢,但是适用于反射,无参构造; new 效率高,可以适用于任何public构造
- 2, newInstance() 是实现IOC、反射、面对接口编程 和 依赖倒置 等技术方法的必然选择,new 只能实现具体类的实例化,不适合于接口编程。
- 3, 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类:
- 4, newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过
- 5, newInstance: 弱类型(GC是回收对象的限制条件很低,容易被回收)、低效率、只能调用无参构造,new 强类型(GC不会自动回收,只有所有的指向对象的引用被移除是才会被回收,若对象生命周期已经结束,但引用没有被移除,经常会出现内存溢出)
可以用new Instance但是不能用new的情况
函数作用:根据传入的类型获取类的对象
Test
public class Test {
public static void main(String[] args) {
// RealClass realClass = new RealClass();
AbstractClass abstractClass = getInstance(RealClass.class);
abstractClass.setId(1);
System.out.println(abstractClass.getId());
System.out.println(abstractClass);
}
public static<T> T getInstance(Class<? extends T> clazz) {
T t = null;
try {
t = (T) clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
}
AbstractClass
public abstract class AbstractClass {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public AbstractClass(){
System.out.println(this.getClass().getPackage().getName());
System.out.println(this.getClass());
System.out.println(AbstractClass.class.getPackage().getName());
}
}
RealClass
public class RealClass extends AbstractClass {
public RealClass(){
super();
}
}
网友评论