谈谈关于深浅克隆的认识

概念

浅克隆是指拷贝对象时仅仅拷贝对象中的基本类型变量(例如int,double,float,注意还有String),而不拷贝对象包含的引用指向的对象(即用户自定义的对象)。
深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
用图解的方式来表示的话,就是:
在这里插入图片描述
在该图中,浅克隆后,自定义的Address对象没有克隆,而是与主体指向相同的对象,主体中的Address如果改变,克隆体中的Address也会随之改变。

而深克隆则是:
在这里插入图片描述
即克隆体与主体中的所有对象都不同,都不会互相影响。

实现方式

浅克隆的实现方式:(实现Cloneable接口)

public class Person implements Cloneable{
    private String name;
    private int age;
    private Address address;

    public Person() {
    }

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("Hubei","Xiangyang");
        Person p1 = new Person("zs",11,address);
        Person p2 = (Person)p1.clone();
        System.out.println("p1=>"+p1);
        System.out.println("p2=>"+p2);
        System.out.println("============修改地址后============");
        address.setCity("Wuhan");
        System.out.println("p1=>"+p1);
        System.out.println("p2=>"+p2);
    }
}

运行结果:
在这里插入图片描述
结论:修改p1的address对象后,浅克隆后的p2中的address对象也会被动地改变

深克隆的方式:
与浅克隆相比,深克隆需要在重写clone()方法时做一些手脚

@Override
protected Object clone() throws CloneNotSupportedException {
    Person p = (Person) super.clone(); //获取一个浅复制对象
    p.setAddress((Address) p.getAddress().clone());//将对象中需要深复制的属性再克隆一次(自定义的对象也需要实现Cloneable接口)
    return p;
}

【注:Address类也要实现Cloneable接口,并且Address类中的属性必须全部是基本数据类型,否则还要继续嵌套下去】
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述
结论:深克隆后,自定义对象也会复制一份。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,深复制和浅复制是两种不同的复制方式。 浅复制是创建一个新对象,这个对象有着原始对象的引用,但是它并不复制原始对象的数据。在Python中,使用copy()方法可以实现浅复制。 深复制是创建一个新对象,这个对象有着原始对象数据的完整复制。在Python中,使用deepcopy()方法可以实现深复制。 需要注意的是,对于不可变对象(如字符串、数字、元组等),无论是深复制还是浅复制都是一样的结果。而对于可变对象(如列表、字典等),深复制会复制整个对象,包括对象内部的所有数据,而浅复制只会复制对象的引用,而不会复制对象内部的数据。 下面是一个例子,展示了浅复制和深复制的区别: ``` import copy # 浅复制 a = [1, 2, [3, 4]] b = copy.copy(a) a[2][0] = 5 print(a) # [1, 2, [5, 4]] print(b) # [1, 2, [5, 4]] # 深复制 c = copy.deepcopy(a) a[2][1] = 6 print(a) # [1, 2, [5, 6]] print(c) # [1, 2, [5, 4]] ``` 在上面的例子中,我们首先使用浅复制创建了一个列表b,然后修改了a列表中的一个元素。可以看到,由于浅复制只复制了对象的引用,所以修改a列表中的元素同时也修改了b列表中的元素。 然后我们使用深复制创建了一个列表c,再次修改了a列表中的一个元素。可以看到,由于深复制复制的是整个对象,所以修改a列表中的元素并没有影响到c列表中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值