Java基础-Cloneable接口,深浅拷贝【附python,C++深拷贝、浅拷贝】

本文探讨了深拷贝和浅拷贝的概念,通过Java、Python和C++的例子阐述了如何实现这两种拷贝。在Java中,深拷贝需要实现Cloneable接口并重写clone方法。Python提供了直接赋值、浅拷贝(copy.copy)和深拷贝(copy.deepcopy)三种方式。C++则通过拷贝构造函数来完成深拷贝。对于不可变对象,通常使用浅拷贝,而对于需要独立副本的情况,深拷贝是必要的。
摘要由CSDN通过智能技术生成

关于深拷贝、浅拷贝

可以直观的看到,深拷贝就是复制前后的对象除了值相等以外,是完全没有关系的;而浅拷贝仅仅复制了原对象的引用,二者随意修改值的内容,都会导致另一个对象的值发送变化。
在这里插入图片描述

Java中如何进行拷贝?

首先,Java中除了8种基本数据类型,其余都是对象,并且对象有一个公共的父类Object,在Object中有clone()方法,可以实现深拷贝。

protected native Object clone() throws CloneNotSupportedException;

clone()是受保护类型,因此在子类中必须重写此方法,而且重写之后应该扩大访问权限,这样它才能被外部调用。但是具体的复制方法实现还是在Object中,因此在覆写方法中只需要调用Object类中的clone()方法即可完成操作,而且在对象所在类中必须实现Cloneable接口才可以完成对象的复制操作。

浅拷贝:直接通过等号赋值的可变对象就是浅拷贝,只能得到相同的引用;
深拷贝:通过如下例子,实现Cloneable类,重新定义clone方法,抛出CloneNotSupportedException异常,就可以调用clone方法实现深拷贝了。可以看到rawObj的属性变化并没有影响newObj的属性值,而obj的属性值是随着rawObj变化的,前者为深拷贝,后者为浅拷贝。

euqals方法进行比较相等就说明两个对象的值是相等的,使用全等号==进行比较就说明这两个对象引用的是同一个对象!

public class CloneDemo implements Cloneable {
   
    public String name;

    public CloneDemo(String name) {
   
        this.name = name;
    }

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

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

    public static void main(String[] args) throws CloneNotSupportedException {
   
        cloneDemo rawObj = new cloneDemo("a"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值