Java创建对象主要有四种方法:
1、通过new关键字创建对象
2、通过clone()方法创建一个对象
3、通过反序列化的方式创建对象
4、通过反射机制创建对象
1、通过new语句创建对象
这是java中最简单的创建对象那个的方式,这种方式也可以调用任意的构造函数;
例如:Object obj = new Object();
2、通过clone()方法创建一个对象
在java中任何时候调用对象clone方法,java虚拟机都会创建一个新的对象obj2,会把clone对象obj1的全部内容都复制进去,使用clone方法创建的对象是不可以调用任何的构造函数的。并且在使用clone方法前,必须要实现Cloneable接口才可以实现clone方法。
例如:Object obj2 = <Object>obj1.clone();
3、通过反序列化的方式创建对象
在反序列化时,java虚拟机会创建对象并且不调用任意构造函数,在反序列化一个对象之前,必须先让我们的类实现Serializable接口。
调用java.io.ObjectInputStream对象的readObject()方法。
例如:ObjectInputStream in = new ObjectInputStream (new FileInputStream(“data.obj”));
Object obj3 = (Object)in.readObject();
4、通过反射机制创建对象
调用Java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(1)、使用class类的newInstance方法
Class类本质上调用了反射包构造器类中无参数的newInstance方法,捕获了InvocationTargetException,将构造器本身的异常抛出。通过newInstance方法是调用无参数的构造函数创建对象
例如:Object obj4 = Object.class.newInstance();
Object obj4 = (Student)Class.forName(“根路径.Student”).newInstance();
(2)、使用constructor类的newInstance方法
通过newInstance方法调用有参数和私有的构造函数创建对象。
例如:Object obj5 = constructor.newInstance();
Constructor<Object> constructor = Object.class.getInstance();
以上两种反射机制创建对象的方法中,class的newInstance方法实际上内部调用的就是Construvtor的newInstance方法。
两个newInstance的区别:
1、Class类的newInstance只能触发无参数的构造方法创建对象,而构造器类的newInstance能触发有参数或者任意参数的构造方法来创建对象。
2、Class类的newInstance需要其构造方法是共有的或者对调用方法可见的,而构造器类的newInstance可以在特定环境下调用私有构造方法来创建对象。
3、Class类的newInstance抛出类构造函数的异常,而构造器类的newInstance包装了一个InvocationTargetException异常。
4、Class类位于java的lang包中,而构造器类是java反射机制的一部分。