克隆对象

200 阅读1分钟

克隆对象的几种方法

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'}