Java创建对象的五种方式
一、使用new关键字,调用构造方法创建对象
Person p1 = new Person();
运行过程:
1、给新对象分配内存空间,将数据存储到堆。
2、执行显示的初始化。
3、执行构造器。new方法中括号参数传递给构造器,初始化该对象。
4.该变量被赋值为堆内存中新对象的引用
简而言之:在Java内存的堆中新添加一个new的对象,通过构造方法初始化这个新对象,同时在栈中存放该对象的引用。
二、使用class类的newInstance方法,调用无参的构造函数创建对象
Person p2 = (person)Class.forName("包名.Person").newInstance();
//或者
Person p2 = Person.class.newInstance();
三、使用Constructor类中的newInstance方法,调用有参数的或者私有的构造函数
java.lang.reflect.Constructor类中一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。
Constructor<Person> constructor = Person.class.getConstructor();
Person p3 = constructor.newInstance();
注:使用Class类和Constructor类中的newInstance方法就是——反射。Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架,如Spring、Hibernate、Struts等使用Constructor类中的newInstance方法的原因。
以下对两种调用方式给以比较说明:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
Class.newInstance() 抛出所有由被调用构造函数抛出的异常。
Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的;
Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数
四、使用clone方法,不会调用构造方法
我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造方法。但是Person需要先实现Cloneable接口并实现其定义的clone方法。
Person p4 = (Person)p3.clone();
五、使用反序列化,不会调用构造方法
序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让Person类实现Serializable接口
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Person p5 = (Person) in.readObject();
除了第1个方法,其他4个方法全都转变为invokevirtual(创建对象的直接方法),第一个方法转变为两个调用,new和invokespecial(构造函数调用)。

浙公网安备 33010602011771号