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

浅拷贝与深拷贝

在这里插入图片描述

作者简介: zoro-1,目前大一,正在学习Java,数据结构等
作者主页: zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

浅拷贝与深拷贝

  • 浅拷贝
    • 浅拷贝定义
    • 浅拷贝代码演示
    • 浅拷贝的特点
  • 深拷贝
    • 深拷贝定义
    • 深拷贝代码演示
    • 深拷贝特点

浅拷贝

之前我们学了数组的拷贝,那么对象如何进行拷贝呢

浅拷贝定义

浅拷贝是一种复制对象的方法,在这种方法中,只复制对象的引用或指针,而不是对象本身的内容。

浅拷贝代码演示

class Hia{int a=6;
}
class Animal {String name="animal";int age=0;Hia hia=new Hia();public Animal(String name, int age) {this.name = name;this.age = age;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy=(Animal) dog.clone();}
}

代码讲解:

初始化Animal类为dog对象,现在想要copy一份dog对象,就要了解clone方法,他是object类里面的方法也就是Animal的父类的方法(因为所有类都是继承object类),这个类是由protected修饰所以我们不能直接调用,他的最大访问权限是不同包下的子类对象,且只能用super访问所以要在定义一个不带static修饰的方法下面访问,我这里采用的是重写父类的clone方法,返回super.clone();,clone的返回值对象是object,所以要强转为(Animal);
上面的代码运行出来结果还是错的
在这里插入图片描述
原因是在java里面只有实现Cloneable接口才说明这个类是支持拷贝的(虽然这个接口什么都没有);

浅拷贝的特点

特点是他只是将你类里面的变量的值赋值下来,不会将你成员对象引用的也赋值一份,下面这个图就能很好解释

在这里插入图片描述

当然我们也可以用代码直观的看出来

public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy=(Animal) dog.clone();System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);dog.hia.a=9;System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);}
}

在这里插入图片描述

通过运行结果可以看出来我们发现该变原对象的hia.a,复制的对象的hia.a也发生了改变,这说明复制后的hia和前面指向的是同一个引用

想要将复制里面的引用也复制一份就要用到深拷贝

深拷贝

深拷贝定义

深拷贝是指在拷贝一个对象时,创建一个新的对象并将原对象的所有属性值都复制到新对象中,而不是简单地复制对象的引用地址。因此,在深拷贝后,两个对象之间是完全独立的,互不影响。深拷贝通常用于需要完全复制原对象的情况,例如在多线程环境下操作对象时,为了避免不同线程间共享对象导致的数据冲突,就需要使用深拷贝。深拷贝是指在拷贝一个对象时,创建一个新的对象并将原对象的所有属性值都复制到新对象中,而不是简单地复制对象的引用地址。

深拷贝代码演示

class Hia implements Cloneable{int a=6;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}
class Animal implements Cloneable{String name="animal";int age=0;Hia hia=new Hia();public Animal(String name, int age) {this.name = name;this.age = age;}@Overrideprotected  Object clone() throws CloneNotSupportedException {Animal animal=(Animal) super.clone();animal.hia=(Hia) animal.hia.clone();return animal;}
}
public class Text4 {public static void main(String[] args) throws CloneNotSupportedException {Animal dog=new Animal("dog",5);Animal dogcopy= (Animal) dog.clone();System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);dog.hia.a=9;System.out.println(dog.hia.a);System.out.println(dogcopy.hia.a);}
}

在这里插入图片描述
代码解释

我的理解是深拷贝是两层浅拷贝,现将对象进行一次拷贝然后再将dog对象里面的引用对象拷贝一份赋值给新的对象的里面的引用对象,譬如上面的代码,重写的clone()方法里面先super.clone(),复制一份当前类的对象,然后类里面的引用类型Hia调用clone(),复制一份再赋值给animal.hia,那现在animal就是就是彻底的拷贝了,然后返回animal;然后改变dog类里面的hia.a打印输出,只有dog类里面的改变了

深拷贝特点

在这里插入图片描述
深拷贝是一种复制数据的方式,它会创建一个完全独立的副本,而不是原始数据的引用。深拷贝的特点如下:

  1. 完全独立:深拷贝会创建一个全新的对象,而不是原对象的引用。

  2. 完整复制:深拷贝会复制所有的属性和方法,包括对象的嵌套属性和方法。

  3. 递归复制:如果对象有嵌套属性或方法,深拷贝会递归复制嵌套对象的属性和方法。

  4. 不受原对象改变影响:因为深拷贝生成的对象完全独立,所以它不会受到原对象的更改的影响。

需要注意的是,深拷贝可能会导致性能问题,特别是当数据结构非常复杂时。因为深拷贝会复制所有的属性和方法,包括对象的嵌套属性和方法,所以可能需要花费大量的时间和内存来完成。

今天的分享到这里就结束了,感谢大家支持,创作不易,希望大家能给博主个三连在这里插入图片描述

http://www.lryc.cn/news/133362.html

相关文章:

  • 背包 问题
  • 蓝牙资讯|安卓将加强耳机音量监控,耳机查找功能将更加普遍
  • vue,element。监听快捷键粘贴图片,添加到el-upload的列表。
  • 时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)
  • 编织梦想:SpringBoot AOP 教程与自定义日志切面完整实战
  • AssignableTypeFilter 和 AnnotationTypeFilter什么区别?
  • TCP-事件模型
  • typescript 声明文件
  • BC96 有序序列判断
  • QT操作excel的两种方式 QT基础入门【Excel的操作】
  • c++ qt--QString,弹出框(第二部分)
  • CSS自学框架之动画
  • RabbitMQ的5种消息队列
  • 【C语言】选择排序
  • 异步更新队列 - Vue2 响应式
  • 【Unity的URP渲染管线下实现扩展后处理Volume组件_TemporalAntiAliasing(TAA)_抗锯齿(附带下载链接)】
  • NineData通过AWS FTR认证,打造安全可靠的数据管理平台
  • Qt应用开发(基础篇)——滚屏区域类 QScrollArea
  • 安装最新版chromedriver 116,亲测可用
  • html题库
  • Android11 中 LED 使用-RK3568
  • BC77 有序序列插入一个数
  • 通过脚本使用Cppcheck做静态测试并生成报告(Windows)
  • 工业安全生产信息化平台的基本架构和关键功能分享
  • 每日一道面试题之session 和 cookie 有什么区别?
  • SHELL 基础 显示字符颜色, 修改历史命令,Linux里的命令 执行顺序
  • Vue 和 JQuery 的区别在哪?为什么 JQuery 会被 Vue 取代?
  • Spring 中 Bean 注入与获取
  • STM32 中断复习
  • Django的模型