实例和泛型

new与newInstance()的区别
Class cla=Class.forName(“java.lang.String”);//初始化
Object obj=cla.newInstance();//实例化为object类
String str=(String)obj;//向下转换回子类
Class.forName会导致类被初始化,newInstance()才会实例化;
而new()初始化+实例化
相比较,new的语句简单,可以在创建时加入参数调用构造函数,而newInstance()把创建对象步骤分开,使得更灵活

T,Class,Class区别

  1. 调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。
    List list = null;
    Class clazz = list.getClass();

  2. 使用Class类的中静态forName()方法获得与字符串对应的Class对象。
    Class clazz = Class.forName(“com.lyang.demo.fanxing.People”);

  3. 获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。
    Class clazz = List.class;

那么问题来了?Class类是创建出来了,但是Class和Class适用于什么时候呢?
People people = (People) Class.forName(“com.lyang.demo.fanxing.People”).newInstance();
看到了么,需要强转,如果反射的类型不是People类,就会报
java.lang.ClassCastException错误。

使用Class泛型后,不用强转了

public class Test {
	public static  T createInstance(Class clazz) throws IllegalAccessException, 	InstantiationException {
	return clazz.newInstance(); 
	}
	
	public static void main(String[] args) throws IllegalAccessException, InstantiationException {
		Fruit fruit= createInstance(Fruit .class); 
		People people= createInstance(People.class);
	}
}

那Class和Class有什么区别呢?
Class在实例化的时候,T要替换成具体类
Class它是个通配泛型,?可以代表任何类型,主要用于声明时的限制作况
例如可以声明一个:public Class clazz;
但是你不能声明一个:public Class clazz;
不知道定声明什么类型的Class的时候可以定义一个Class,Class可以用于参数类型定义,方法返回值定义等。

你可能感兴趣的:(Java)