浅拷贝与深拷贝

在这里插入图片描述

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/88617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

优秀产品奖!移远5G RedCap模组,让5G真正“轻”下来

8月24日,在通信世界全媒体主办的“5G RedCap技术与物联网应用创新研讨会”上,“5G RedCap优秀产品和解决方案”获奖名单发布,移远通信5G RedCap模组Rx255C系列以其在创新性、实用性、经济性、成熟性等方面的综合领先优势,获此殊荣…

更高效稳定 | 基于ACM32 MCU的编程直流电源应用方案

随着电子设备的多样化发展,面对不同的应用场景,需要采用特定的供电电源。因此,在电子产品的开发测试过程中,必不可少使用编程直流电源来提供测试电压,协助完成初步的开发测试过程。 编程直流电源概述 编程直流电源结构…

李沐pytorch学习-经典CNN的原理及代码实现

一、LeNet 1.1 模型结构 LeNet结构如图1所示,汇聚层即池化层,这里池化Stride(步幅)与池化层长宽一致,因此使得池化后大小减半。 图1. LeNet结构 1.2 代码实现 代码实现如下: import torch from torch imp…

Arnold置乱

一、Arnold置乱概述 Arnold变换是俄国数学家弗拉基米尔阿诺德(Vladimir Igorevich Arnold)提出,Arnold将其应用在遍历理论研究中。由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换(cat映射&am…

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技术手段和方法的运用,可直观的展示主题的研究发展历程、研究现状、研究…

HCIP-OpenStack组件之neutron

neutron(ovs、ovn) OVS OVS(Open vSwitch)是虚拟交换机,遵循SDN(Software Defined Network,软件定义网络)架构来管理的。 OVS介绍参考:https://mp.weixin.qq.com/s?__bizMzAwMDQyOTcwOA&mid2247485088&idx1…

基于AWS的3D模型搜索服务实现

3D模型广泛应用于计算机游戏、电影、工程、零售业、广告等许多领域。市场上有很多制作3D模型的工具,但几乎没有工具可以直观地搜索3D模型数据库以找到类似的3D模型 因为开发好的 3D 模型搜索工具非常具有挑战性。 它需要复杂的计算和 AI/ML 框架来创建模型描述符并提…

jmeter HTTP信息头管理器

首先,打开JMeter并创建一个新的测试计划。右键单击测试计划,选择"添加" > “线程组”,然后在线程组上右键单击,选择"添加" > “Sampler” > “HTTP请求”。 在HTTP请求中填写服务器的URL和其他必要…

Java基础之IO流File类创建及删除

1.File类概述及构造方法 2.File类创建功能 文件创建成功! 如果文件不存在,就创建文件,并返回true 如果文件存在,就不创建文件,并返回false 如果文件夹不存在,就创建文件夹,并返回true 如果文件…

【0基础入门Python Web笔记】三、python 之函数以及常用内置函数

三、python 之函数以及常用内置函数 函数函数定义函数调用函数参数返回值 常用内置函数input()函数range()函数其它 更多实战项目可进入下方官网 函数 函数是一种用于封装可重复使用代码块的工具,能够将一系列操作组织成一个逻辑单元。 函数定义 在Python中&…

【C语言】文件操作 -- 详解

一、什么是文件 磁盘上的文件是文件。 1、为什么要使用文件 举个例子,当我们想实现一个 “通讯录” 程序时,在通讯录中新建联系人、删除联系人等一系列操作,此时的数据存储于内存中,程序退出后所有数据都会随之消失。为了让通讯录…

Python爬虫分布式架构问题汇总

在使用Python爬虫分布式架构中可能出现以下的问题,我们针对这些问题,列出相应解决方案: 1、任务重复执行 在分布式环境下,多个爬虫节点同时从消息队列中获取任务,可能导致任务重复执行的问题。 解决方案:…

由JDK bug引发的线上OOM

由JDK bug引发的线上OOM 最近生产环境的一个应用忽然发生了OOM,还好是业务低峰期,没有导致什么严重问题,下面记录下本次排查的过程; 故障临时处理 在某天下午,正在愉快的写代码时,忽然看到业务反馈支付服…

湘潭大学 湘大 XTU OJ 1055 整数分类 题解(非常详细)

链接 整数分类 题目 Description 按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,246&#…

XXX程序 详细说明

用于记录理解PC程序的程序逻辑 1、程序的作用 根据原作者的说明(文件说明.txt),该程序 (PC.py) 的主要作用是提取某一个文件夹中的某个设备 (通过config中的信息看出来是Ag_T_8) 产生的日志文件,然后提取其中某些需要的数据&…

MyCAT命令行监控

9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…

学习中ChatGPT的17种用法

ChatGPT本质上是一个聊天工具,旧金山的人工智能企业OpenAI于2022年11月正式推出ChatGPT。那么,ChatGPT与其他人工智能产品相比有什么特殊呢? 它除了可以回答结构性的问题,例如语法修正、翻译和查找答案之外。最关键的是它能够去解…

mysql--数据库的操作

数据库,是数据存储的最大单元。 1 创建数据库 create database mydatabase; 每次创建数据库的时候,都会多一个文件夹,关系型数据库是存储在磁盘当中的,所以这时候可以查看新建的数据库 2 指定字符集 MySQL中的字符集转换过程 制…

工程师是怎样对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师,亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践,也看到了很多 Bad Cases,所以想把自己的一些心得体会写在这里,供工程师进行…