浅拷贝与深拷贝

简介: 浅拷贝与深拷贝

作者简介: 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;
    }
    @Override
    protected 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;
    @Override
    protected 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;
    }
    @Override
    protected  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.不受原对象改变影响:因为深拷贝生成的对象完全独立,所以它不会受到原对象的更改的影响。

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


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



目录
相关文章
|
Linux
Linux系统之touch命令的基本使用
Linux系统之touch命令的基本使用
391 1
|
数据采集 运维 搜索推荐
手把手教你如何申请网站空间
网站空间就像房屋的地基,对网站运营的影响非常大。在网站还没有发布之前,首先需要考虑存放的空间。
1854 0
手把手教你如何申请网站空间
|
8月前
|
编解码 虚拟化 Windows
通过Hyper分辨率适配技术,可以解决虚拟机显示器上的分辨率适配难题
Hyper-V的增强会话模式通过RDP协议实现虚拟机与物理显示器的高质量连接,支持更高分辨率、优化图形性能,并提供共享剪贴板、拖放文件等增强功能。启用此模式可解决虚拟机分辨率适配难题,提升显示效果和交互性。需确保操作系统支持RDP,网络稳定,且注意对主机性能的影响。
|
5月前
|
IDE Java 开发工具
Java 基础篇必背综合知识点最新技术与实操应用全面总结指南
本总结梳理了Java 17+的核心知识点与新技术,涵盖基础概念(模块化系统、GraalVM)、数据类型(文本块、模式匹配)、流程控制(增强switch)、面向对象(Record类、密封类)、常用类库(Stream API、HttpClient)、实战案例(文件处理)、构建工具(Maven、Gradle)、测试框架(JUnit 5)、开发工具(IDE、Git)及云原生开发(Spring Boot 3、Docker)。通过理论结合实操,帮助开发者掌握Java最新特性并应用于项目中。代码示例丰富,建议配合实践加深理解。
158 4
|
6月前
|
人工智能 算法 架构师
人工智能认证就业:从能力认证到职业跃迁的路径解析
人工智能浪潮席卷全球,AI技术正深刻重构职业生态。生成式人工智能认证(GAI认证)应运而生,作为系统化能力认证体系,它不仅帮助个人锚定技术方向,也为企业提供可靠的人才评估标尺。本文从宏观与个体视角探讨AI认证的价值:宏观上,认证体系是人才市场的“通用语言”,助力伦理合规;个体层面,认证能打破经验壁垒、实现职业跃迁,并通过体系化学习提升安全感。GAI认证以“技术深度+场景广度+伦理高度”设计,成为连接技术变革与职业发展的桥梁,鼓励每个人成为AI时代的“能力架构师”。
|
6月前
|
传感器 人工智能 自动驾驶
生成式AI应用于自动驾驶:前沿与机遇
近期发表的一篇综述性论文总结了生成式AI在自动驾驶领域的应用进展,并探讨了自动驾驶与机器人、无人机等其它智能系统在生成式AI技术上的交叉融合趋势
287 10
|
8月前
|
Linux
linux命令详细说明以及案例
本文介绍了常用的 Linux 命令及其详细说明和示例,包括:`ls`(列出目录内容)、`cd`(更改目录)、`rm` 和 `mv`(删除与移动文件)、`grep`(搜索文本)、`cat`(显示文件内容)以及 `chmod`(更改文件权限)。每个命令均配有功能描述、选项说明及实际案例,帮助用户更好地掌握 Linux 命令的使用方法。
375 56
|
10月前
|
存储 IDE 开发工具
ModelScope魔搭25年1月版本发布月报
随着2025年帷幕的缓缓拉开,ModelScope团队怀着新年新气象的美好期许,为广大开发者带来了1月份的重磅更新。
459 13
|
边缘计算 运维 安全
服务化架构 (SBA) 在 5G 核心网中的关键作用
服务化架构 (SBA) 在 5G 核心网中的关键作用
872 1
|
人工智能 弹性计算 自然语言处理
通义万相AI创作绘画产品方案产品体验
本次我有幸接触并体验了阿里云通义万相这一创新的AI绘画工具方案。该方案它是在利用人工智能技术,为用户提供创新、便捷的绘画创作体验。在体验过程中,我主要关注了产品的易用性、功能性、创新性、用户体验及方案本身等方面。
516 3