- 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类:
newInstance
创建类是这个类必须已经加载过且已经连接(Class.forName(“A”)
这个过程),new
创建类是则不需要这个类加载过newInstance
是弱类型(GC是回收对象的限制条件很低,容易被回收)、低效率、只能调用无参构造,new
是强类型(GC不会自动回收,只有所有的指向对象的引用被移除是才会被回收,若对象生命周期已经结束,但引用没有被移除,经常会出现内存溢出)newInstance
实例化对象只能调用无参构造方法(如果重写了一个带参构造方法,想要使用newInstance
,则必须指定一个无参构造方法,否则会报初始化错误)
Class c = Class.forName(“A”);
factory = (AInterface)c.newInstance();
其中AInterface是A的接口,如果下面这样写,你可能会理解:
String className = “A”;
Class c = Class.forName(className);
factory = (AInterface)c.newInstance();
//进一步,如果写成下面这样,更好理解:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
Class c = Class.forName(className);factory = (AInterface)c.newInstance();
上面代码就消灭了A类名称,优点:无论A类怎么变化,上述代码不变,甚至可以更换A的兄弟类B , C , D….等,只要他们继承Ainterface
就可以。
newInstance
实际上是把new
这个方式分解为两步,即,首先调用class的加载方法加载某个类,然后实例化。
这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName
时获得更好的灵活性,提供给了我们降耦的手段。