总结
1、new
2、反射机制
3、clone机制,根据一个已有对象,克隆一个新对象。
4、序列化机制,先将一个对象序列化为二进制,再反序列化为java对象。
代码演示
下面的代码将会演示这四种创建对象的方式
我们要创建的的对象是一个Person类
java
import java.io.Serializable;
public class Person implements Serializable, Cloneable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
下面是main方法
java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) throws Exception {
// 1) new
Person p1 = new Person("Alice", 20);
print("new", p1);
// 2) reflection
Person p2 = Person.class.getDeclaredConstructor().newInstance();
p2.setName("Bob");
p2.setAge(21);
print("reflection", p2);
// 3) clone
Person p3 = (Person) p1.clone();
p3.setName("Alice-Clone");
print("clone", p3);
// 4) serialization
Person p4 = serializeAndDeserialize(p1);
print("serialization", p4);
}
private static void print(String label, Person person) {
System.out.println(label + ": " + person + ", identityHashCode=" + System.identityHashCode(person));
}
private static Person serializeAndDeserialize(Person original) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (ObjectOutputStream out = new ObjectOutputStream(bos)) {
out.writeObject(original);
}
byte[] data = bos.toByteArray();
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data))) {
return (Person) in.readObject();
}
}
}
输出
out
new: Person{name='Alice', age=20}, identityHashCode=764977973
reflection: Person{name='Bob', age=21}, identityHashCode=189568618
clone: Person{name='Alice-Clone', age=20}, identityHashCode=793589513
serialization: Person{name='Alice', age=20}, identityHashCode=1190654826
面试
有四种方式,直接new对象,用反射机制动态创建对象,用clone机制复制一个新对象,用序列化机制的反序列化操作创建对象。