目录

new与newInstance()的区别

简单测试

1
2
3
4
String st = (String)Class.forName("java.lang.String").newInstance();
String st1=new String();
boolean bl=st.getClass()==st1.getClass();
System.out.println(bl);

返回为ture

这两种方法得到的结果是一样的

原因

分析下原因,第一种方法是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化

可以分解开

1
2
3
4
5
Class cla=Class.forName("java.lang.String");//初始化
Object obj=cla.newInstance();//实例化为object类
String str=(String)obj;//向下转换回子类
//但
Class.forName();//有它自己的用法

通过

1
2
3
String str =""
Class c = Class.forName(str);
c.newInstance();

可以动态的创建对象

Object st = (String)Class.forName("java.lang.String").newInstance(); 这个方法返回的是一个类,可以强制转换成各种子类

主要作用

因此可以改变强制转换的类型与forName()的参数来创建不同类型的对象,只要他们是Object的子类

在连接数据库时,发现还可以这样用Class.forName(driver);

查找资料了解到,这个方法在使用时,JVM会查找并加载指定的类,也就是说JVM会执行该类的静态代码段

而使用new时,这个类可以没有被加载(是可以不是一定)

测试使用Driver dri=new Driver();一样加载了类

然后测试了下构造方法的调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class ceshi{
    int a=0;
    public ceshi(){
        System.out.println(a);
    }
}

Class aaa=Class.forName("ceshi");//没有调用构造方法
  aaa.newInstance();//调用
  new ceshi();//调用

如果想要调用构造方法,需要调用newInstance.forname()会导致类被初始化,newInstance()才会实例化,而new()初始化+实例化

总结

初始化和实例化的区别,另开一篇再做研究 相比较,new的语句简单,可以在创建时加入参数调用构造函数,而newInstance()把创建对象步骤分开,使得更灵活