Java-深拷贝(deep copy)

1. 首先Java的clone()方法,我们已经了解

2. 接着clone()方法的浅拷贝,浅拷贝有一些不尽人意的地方

3. 目的:

  为了解决不如意,

  为了解决修改clone()得到的新对象不会影响被复制对象的字段的问题,

  我们需要实现深拷贝(deep copy)。

4. 示例:

package com.basis.entity;

public class Person implements Cloneable {

    private String adress;
    private Info info;

    public String getAdress() {
        return adress;
    }

    public void setAdress(String adress) {
        this.adress = adress;
    }

    public Info getInfo() {
        return info;
    }

    public void setInfo(Info info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Person{" +
                "adress='" + adress + '\'' +
                ", info=" + info +
                '}';
    }

    public Object clone() throws CloneNotSupportedException{
        Person person = (Person) super.clone();
        person.info = (Info) info.clone();
        return person;
    }
}
package com.basis.entity;

public class Info implements Cloneable {

    private String IDCard;
    private String name;

    public String getIDCard() {
        return IDCard;
    }

    public void setIDCard(String IDCard) {
        this.IDCard = IDCard;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Info{" +
                "IDCard='" + IDCard + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}
package com.company;

import com.basis.entity.Info;
import com.basis.entity.Person;

public class Main {

    public static void main(String[] args) {

        Info info = new Info();
        info.setName("张三");
        info.setIDCard("111111");

        Person person1 = new Person();
        person1.setAdress("北京");
        person1.setInfo(info);

        System.out.println("clone()前person1:"+person1.toString());

        Person person2 = null;
        try {
            person2 = (Person)person1.clone();
            person2.setAdress("河南");
            Info info1 = person2.getInfo();
            info1.setName("李四");
            info1.setIDCard("222222");
            person2.setInfo(info1);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        System.out.println("clone()后person1:"+person1.toString());
        System.out.println("clone()后person2:"+person2.toString());

    }
}

5. 结果:

clone()前person1:Person{adress='北京', info=Info{IDCard='111111', name='张三'}}
clone()后person1:Person{adress='北京', info=Info{IDCard='111111', name='张三'}}
clone()后person2:Person{adress='河南', info=Info{IDCard='222222', name='李四'}}

6. 完美解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,深拷贝Deep Copy)和浅拷贝(Shallow Copy)是用于描述对象拷贝的概念。 浅拷贝是指创建一个新对象,新对象的属性值和原对象的属性值相同,但是对于引用类型的属性,新旧对象将共享同一个引用。也就是说,新旧对象的引用类型属性指向同一个内存地址。 深拷贝则是在拷贝对象时,不仅会复制对象本身,还会递归复制对象的引用类型属性,使得新对象和原对象的引用类型属性指向不同的内存地址。 Java 中的默认拷贝行为是浅拷贝。可以通过以下两种方式实现深拷贝: 1. 实现 `Cloneable` 接口并重写 `clone()` 方法:这是一种较为简单的实现深拷贝的方式。在需要进行深拷贝的类中,实现 `Cloneable` 接口,并重写 `clone()` 方法,在 `clone()` 方法中递归复制引用类型的属性。 ```java class MyClass implements Cloneable { private int number; private MyObject myObject; // constructors, getters, setters @Override protected Object clone() throws CloneNotSupportedException { MyClass cloned = (MyClass) super.clone(); cloned.myObject = (MyObject) myObject.clone(); // 实现 MyObject 的 clone() 方法 return cloned; } } ``` 通过调用 `clone()` 方法来创建一个新的深拷贝对象:`MyClass clonedObject = (MyClass) originalObject.clone();` 2. 使用序列化和反序列化:这是另一种实现深拷贝的方式。通过将对象序列化为字节流,然后再将字节流反序列化为新的对象,可以实现深拷贝。这种方式需要确保对象及其引用类型属性都是可序列化的。 ```java import java.io.*; class MyClass implements Serializable { // class definition } ``` ```java // 实现深拷贝的方法 public static <T extends Serializable> T deepCopy(T object) throws IOException, ClassNotFoundException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); objectOutputStream.writeObject(object); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); return (T) objectInputStream.readObject(); } ``` 通过调用 `deepCopy()` 方法来创建一个新的深拷贝对象:`MyClass clonedObject = deepCopy(originalObject);` 需要注意的是,为了实现深拷贝,引用类型的类也需要实现 `Cloneable` 接口并重写 `clone()` 方法,或者是可序列化的。 希望这些信息对你有所帮助。如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值