克隆对象的几种方法
1手动克隆
var user2 = new User
{
Id = user1.Id,
Name = new UserName
{
FirstName= user1.Name.FirstName,
LastName= user1.Name.LastName
}
};
2反射
代码如下:
var user3 = user1.Copy() as User;
3浅克隆
1.概念
对象的复制,完整地复制一个对象
2克隆细节分析
Object类:
依靠Object类,Object类中含有对象的克隆方法
创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。 protected Object clone() throws CloneNotSupportedException Cloneable接口:
该接口无操作方法,是一个标识接口,但是要实现对象的克隆必须实现此接口
3.克隆操作
实现接口并重写方法:
public class Person implements Cloneable {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
'}';
}
protected Object clone() throws CloneNotSupportedException{
return super.clone();//具体的操作由父类来完成
}
public static void main(String[] args) throws CloneNotSupportedException {
Person person1=new Person("Tom");
Person person2=(Person)person1.clone();
person2.setName("Jack");
System.out.println(person1);
System.out.println(person2);
}
}
实现对象的克隆需要实现Cloneable接口并重写Object类的clone()方法。
测试:
Person{name='Tom'}
Person{name='Jack'}
4深度克隆(利用序列化和反序列化)
1.创建Person类并实现序列化接口:
import java.io.Serializable;
public class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + ''' +
'}';
}
}
要实现序列化或反序列化必须实现接口Serializable
2.运用序列化与反序列化实现对象的克隆:
import java.io.*;
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Tom");
try {
ByteArrayOutputStream bas =new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bas);
oos.writeObject(person1);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bas.toByteArray()));
Person person2 =(Person) ois.readObject();
person2.setName("Jack");
bas.flush();
oos.flush();
bas.close();
oos.close();
ois.close();
System.out.println(person1);
System.out.println(person2);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
测试:
Person{name='Tom'}
Person{name='Jack'}