当前位置: 首页 > article >正文

【Java篇】——浅拷贝or深拷贝

目录

🚩克隆步骤

🚩拷贝

🎈浅拷贝

🎈深拷贝

🚩源代码


🚩克隆步骤

Java 中内置了一些很有用的接口 , Clonable 就是其中之一 .【一般接口都是able来设定的,able是可以..的表示一种能力】
Object 类中存在一个 clone 方法 , 调用这个方法可以创建一个对象的 " 拷贝 ". 但是要想合法调用 clone 方法 , 必须要先实现 Clonable 接口 , 否则就会抛出 CloneNotSupportedException 异常 .

我们需要重写Override方法中的clone方法。

 代码的底层是不可以见的。


❗调用clone()方法的返回值是Object类 ,而我们拷贝给子类,所以需要强制类型转换。

❗ 抛出异常问题,后面说到异常的时候我会详细说清楚


实现克隆我们需要四个步骤:
第一步:声明接口implements Cloneable

第二步:重写clone()方法

第三步:声明异常 throws CloneNotSupportedException

第四步:向下转型(强转)因为clone()返回的是父类,父类拷贝给子类,需要向下转型。


🚩拷贝

克隆之后的值确实相等的值。


🎈浅拷贝

class Money{
    public double money=12.5;
}
class Student implements Cloneable{
    int age;
    public Money money=new Money();
    public Student(int age) {
        this.age = age;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}

我们在Student类里定义一个Money类,相当于Student的成员;

money对象指向了自己的成员变量money值为12.5

现在我们将student1拷贝给student2,我们可以看到他们的money值是一样的。

指向的是同一块空间。

如果我们修改money的值呢?

我们改变student2里面money指向的对象的值,也同时改变了student中money指向的值,因为我们只是拷贝了student里面的成员,而没有给成员的成员拷贝,所以都还是指向了同一块空间,改变money的值就会让都改变。这就是浅拷贝


🎈深拷贝

我们需要给money指向的成员也创建一个空间

ox87空间的money修改,不会影响0x99里的money的值。这叫深拷贝。

我们就像Student克隆的步骤都进行一遍。

  protected Object clone() throws CloneNotSupportedException {
        Student tmp=(Student) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
    }

创建一个临时对象,然后super.clone(),因为super是自己的父类,我们需要向下转型,强转,给Student类里的成员拷贝,然后我们继续给Student里面的成员Money类创建的成员拷贝,需要调用当前对象的this。


🚩源代码

package CloneClass;

class Money implements Cloneable{
    public double money=12.5;

    @Override
    protected Object clone() throws CloneNotSupportedException {
       return super.clone();
    }
}
class Student implements Cloneable{
    int age;
    public Money money=new Money();
    public Student(int age) {
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student tmp=(Student) super.clone();
        tmp.money=(Money) this.money.clone();
        return tmp;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}
public class Test1 {
    public static void main(String[] args)throws CloneNotSupportedException  {
//        Student student1=new Student(10);
//        Student student2=(Student) student1.clone();
//        System.out.println(student1);
//        System.out.println(student2);
        System.out.println("修改前==============");
        Student student1=new Student(10);
        Student student2=(Student) student1.clone();
        System.out.println("studetn1::"+student1.money.money);
        System.out.println("student2::"+student2.money.money);
        System.out.println("修改后==============");
        student1.money.money=199.99;
        System.out.println("studetn1::"+student1.money.money);
        System.out.println("student2::"+student2.money.money);
    }
}


http://www.kler.cn/a/228537.html

相关文章:

  • Linux——信号量和(环形队列消费者模型)
  • 什么是报文的大端和小端,有没有什么记忆口诀?
  • PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明
  • VSCode的配置与使用(C/C++)
  • 【json_object】mysql中json_object函数过长,显示不全
  • 在 Babylon.js 中使用 Gizmo:交互式 3D 操作工具
  • 2023年的本地外卖市场,对创业者而言还是块香饽饽吗?
  • 【Golang】exec.command命令日志输出示例
  • C# 怎么判断屏幕是第几屏幕?屏幕是垂直还是水平?屏幕的分辨率?
  • 【Linux】静态库和动态库
  • Linux环境生成allure测试报告
  • 龙行龘龘迎新春,书写春联送祝福
  • 云计算关键技术
  • 3、安全开发-Python-协议库爆破FTPSSHRedisMYSQLSMTP等
  • 紫光展锐M6780丨用MEMC捕捉每帧精彩
  • 计算机网络_1.6.3 计算机网络体系结构分层思想举例
  • 蓝桥杯2024/1/31-----底层测试模板
  • 一篇文章认识Vue3
  • 语言类型(静态语言、动态语言)
  • leetcode680 验证回文串 II
  • 行测怎么搜题答案?推荐你使用这七个公众号和工具 #经验分享#职场发展#学习方法
  • 七月论文审稿GPT第2.5版:微调GPT3.5 turbo 16K和llama2 13B以扩大对GPT4的优势
  • 【51单片机】直流电机实验和步进电机实验
  • JavaSE-项目小结-IP归属地查询(本地IP地址库)
  • 突破编程_C++_基础教程(指针)
  • Java on Azure Tooling 2024年1月更新|Azure Key Vault 支持、示例项目创建支持及更多