String st1=new String();
boolean bl=st.getClass()==st1.getClass();
System.out.println(bl);
返回为ture
这两种方法得到的结果是一样的
分析下原因,第一种方法是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化
可以分解开
Class cla=Class.forName("java.lang.String");//初始化
Object obj=cla.newInstance();//实例化为object类
String str=(String)obj;//向下转换回子类
但
Class.forName()有它自己的用法
通过
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();一样加载了类
然后测试了下构造方法的调用
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()把创建对象步骤分开,使得更灵活