Java种有5种创建新对象的方式
- 调用关键字new
这种也是我们一开始最常见的方式:
person p1 = new person("zs", 20, "男");
- 使用反射机制
反射机制有两种方法,一种是使用Class类的newInstance方法。
调用无参的构造方法。
person p2;
try {
p2=(person)Class.forName("ioText/tex2").newInstance();
//或者也可以
p2=person.getClass().newInstance();
}catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
另外一种方法是调用Constructor类中的newInstance方法。java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个方法调用有参数的和私有的构造函数。
try {
Constructor<person> c=person.class.getConstructor();
person p3=c.newInstance();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
- 调用Clone()方法
再调用Clone方法前,要注意的是我们要先实现Cloneable接口,并且定义clone()方法。
person p = new person("zs", 20, "男");
person p1= (person)p.clone();
- 反序列化方法
当我们序列化或者反序列化一个对象,jvm会给我们创建一个单独的对象。在我们反序列化时,jvm创建对象并不会调用构造函数。在使用反序列化前,我们要像Clone()方法一样,实现Serializable接口。
try {
ObjectInputStream in =
new ObjectInputStream(new FileInputStream("D:/java2/ioText/text2.txt"));
person p = (person) in.readObject();
System.out.println(p);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
我们对五种创建方法进行对比,会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。
创建方式 | 是否调用构造函数 |
---|---|
使用new关键字 | 调用了构造函数 |
使用Constructor类的newInstance方法 | 调用了构造函数 |
使用Class类的newInstance方法 | 调用了构造函数 |
使用clone方法 | 没有调用构造函数 |
使用反序列化 | 没有调用构造函数 |