举例说明深拷贝和浅拷贝

news2024/11/15 13:54:44

概述

简单描述一下对象的实例化过程。

创建对象的时候,或者说在实例化对象的时候 Person 类有年龄和学生类

int age = 18;
Student stu1 = new Student();

比如此时创建一个 age 对象,一个Student 对象,在虚拟机中,会在堆中开一个对象空间,里面包含了对象的属性信息,当给基本数据类型赋值时,会将赋的值存储在堆中,然后在栈中会创建一个对象名保存着堆中数据的地址。简单说就是指向堆中的对象。给引用数据类型赋值时,会将赋的值存在方法区的常量池中,而堆保存的是方法区的地址,栈中同样保存的是堆中的地址。

拷贝

浅拷贝:浅拷贝会在堆上创建一个新的对象,不过,如果原对象内部的属性是引用数据类型的话,浅拷贝会直接赋值内部对象的引用地址,也就是说原对象和拷贝对象指向同一个对象。

深拷贝:深拷贝会完全赋值整个对象,包括这个对象的所有的内部对象。

举个通俗的例子

此时你的电脑桌面上有两个东西,一个是一个压缩包,里面有很多东西,比如图片压缩包等,还有一个是一款游戏的快捷方式。

浅拷贝,就像是你把快捷方式复制粘贴了一遍,无论你使用哪个都可以 XX!启动!,因为他们都是指向游戏本体程序的,属于两个对象指向同一个内部对象。

深拷贝,就像是你把压缩包复制了一遍,你不管将哪一个压缩包拷贝到U盘都可以在另一台电脑使用。因为两个都是独立的对象,只不过一模一样。

图片来源:JavaGuide 

实例代码

浅拷贝

/**
* 地址类
*
*/

@Data
public class Address implements Cloneable{

    private String name;

    @Override
    public Address clone() {
        try {
            return (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
/**
* 人类
*/

@Data
public class Person implements Cloneable {

    private Address address;

    @Override
    public Person clone() {
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
/**
* 测试
*/ 
Person person1 = new Person();
Person clone = person1.clone();
System.out.println(person1.getAddress() == clone.getAddress());

输出为 true,表示两个对象的内部对象是同一个对象。

修改为深拷贝 ,我们将Person 类中的 Address 对象也进行了拷贝,相当于我不久将快捷方式也复制了一次,也将游戏的实际程序主体也进行了复制。

    @Override
    public Person clone() {
        try {
            Person person = (Person) super.clone();
            person.setAddress(person.getAddress().clone());
            return person;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
Person person = new Person(new Address());
Person clone = person.clone();
System.out.println(clone.getAddress() == person.getAddress());

输出为 false,说明内部对象已经不是同一个对象了,内部对象也被拷贝的一次。 

参考资料:Java 面试指南 | JavaGuide

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型财务行业落地,金蝶徐少春:未来“人人都是财务人员”

财务管理价值模型从陀螺型向沙漏型转变。 AI使财务人员在计划与控制领域从只靠经验预测转变为精准预测,让财务管理信息从数据专享转变到信息普惠、专家服务从个人精英转变到AI天团、外部报告的重点从财务指标转变到发展能力评价,企业也从传统的‘财务信息…

STM32-旋转编码器和对射式红外传感器

本内容基于江协科技STM32视频内容,整理而得。 文章目录 1. 旋转编码器和对射式红外传感器1.1 旋转编码器1.1.1 旋转编码器简介1.1.2 旋转编码器硬件电路 1.2 对射式红外传感器 2. 库函数及代码2.1 EXTI库函数和NVIC库函数2.2 5-1对射式红外传感器计次2.2.1 硬件电路…

DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022

DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程。从实验结果来看,效果非常不错 来源:晓飞的算法工程笔记 公众号 论文: Should All Proposals be Treated Equally in Object Detect…

HAProxy安装配置详解

HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。   HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上&#xf…

algorithm算法库学习之——修改序列的操作

algorithm此头文件是算法库的一部分。本篇介绍修改序列的操作函数。 修改序列的操作 copycopy_if (C11) 将某一范围的元素复制到一个新的位置 (函数模板) copy_n (C11) 将一定数目的元素复制到一个新的位置 (函数模板) copy_backward 按从后往前的顺序复制一个范围内的元素 (函…

Java异常详解及自定义异常

认识异常,掌握异常处理主要的5个关键字:throw、try、catch、final、throws并掌握自定义异常 目录 1、异常概念与体系结构 1、1异常的概念 1、2异常体系结构 1、3异常的分类 编译时异常: 运行时异常 : 2、异常处理 2、1防御式…

优思学院|SPC控制图异常点占比可否用来评估过程的稳定程度?

使用SPC控制图异常点占比确实可以评估过程的稳定程度。通常来说,SPC(统计过程控制)控制图是用于监控和控制生产或业务过程,以确保这些过程在可接受的范围内运行。通过识别和分析控制图中的异常点,可以判断过程是否存在…

服务器本地部署文件服务器minio

minio类似于阿里云的OSS,为不方便把图、文、日志等形式的文件保存在公有云上的,可以在自己的服务器上部署文件服务器 看过本人前几个文章的,使用docker就会很快上手部署,直接上所有代码 #添加镜像 docker search minio docker p…

DAY1: 实习前期准备

文章目录 VS Code安装的插件C/CCMakeGitHub CopilotRemote-SSH 收获 VS Code 下载链接:https://code.visualstudio.com 安装的插件 C/C 是什么:C/C IntelliSense, debugging, and code browsing. 为什么:初步了解如何在VS Code里使用C输出…

使用C Caller 模块集成C代码到Simulink模型

可以使用 C Caller 模块将新的或现有的 C 代码集成到 Simulink 模型中。要在 Simulink 模型中创建自定义模块,C Caller 模块允许您调用在外部源代码和库中指定的外部 C 函数。C Caller 模块具有以下优势: 简单 C 函数的自动集成,包括命名空间…

同声传译的app有哪些?分享5个旅行者的多语言翻译伙伴

许多人可能并不了解什么是同声传译。其实,同声传译是一种高效的语言服务,它使得不同语言的人们能够在会议、谈判、演讲等场合中实现即时交流。 今天,本文将向您介绍几款能够实现同声传译的实用工具,帮助您更深入地了解同声传译的…

做外贸干一行爱一行,还是干一行厌一行?

记得年轻的时候,每每和同龄人不同行业聊天的时候,大家普遍的感觉就是:自己这一行太苦了,以后有孩子了干什么都不能让他做自己这一行。 和在银行上班的同学聊天,他们最大的苦恼是需要每天开发客户, 让客户在…

如何利用股指期货代替买股票?

当我们深入探讨中金所上市的三个股指期货——IF(沪深300股指期货)、IC(中证500股指期货)和IH(中证50股指期货)时,我们可以从多个角度来分析它们的特点和优势。 市场特点分析 IH(上…

科研绘图系列:R语言径向柱状图(Radial Bar Chart)

介绍 径向柱状图(Radial Bar Chart),又称为雷达图或蜘蛛网图(Spider Chart),是一种在极坐标系中绘制的柱状图。这种图表的特点是将数据点沿着一个或多个从中心向外延伸的轴来展示,这些轴通常围绕着一个中心点均匀分布。 特点: 极坐标系统:数据点不是在直角坐标系中展…

Qt json和xml操作

学习目标: 认识json和xml读写操作 前置环境 运行环境:qt creator 4.12 学习内容 XML XML(Extensible Markup Language)是一种标记语言,是一种用于描述数据结构的语言。它非常适合用于存储和传输数据。 XML 的主要特点如下: 可扩展性:XM…

TypeSscript 学习(一)

一、为什么使用 TypeScript 因为 js 是一种 弱类型语言 编写代码比较灵活 但是当项目比较大时 这种灵活不利于维护 我们用 TypeScript 这种强类型的语言 比较利于维护 二、语法 1.类型推断 ts 通过我们写的内容 知道变量的类型 定义 str 为 abc 以后 str 只能存 字符串…

element-ui操作表格行内容如何获取当前行索引?

需求&#xff1a; 根据每个用户的提交次数、撤回次数&#xff0c;动态计算出实际次数&#xff0c;并且提交次数不能小于撤回次数 <template><div><el-table:data"tableData"style"width: 80%"border><el-table-columnprop"date&…

俄罗斯VK与Yandex,谁的优势更胜一筹?

俄罗斯VK和Yandex作为该国两大重要的网络平台&#xff0c;各自具有独特的优势。 VK是一个社交媒体巨头&#xff0c;以其庞大的用户基础著称。 这个平台不仅拥有超过数亿的注册用户&#xff0c;而且这些用户在平台上的活跃度极高&#xff0c;每天都会产生海量的内容与互动。 …

优优嗨聚集团:餐饮新纪元,揭秘餐饮合作背后的双赢奥秘

在竞争激烈的餐饮市场中&#xff0c;单打独斗早已不再是主流&#xff0c;而餐饮合作却成为了一种新的趋势。那么&#xff0c;餐饮合作究竟有哪些优势&#xff0c;能够吸引众多餐饮从业者纷纷投身其中呢&#xff1f;本文将为您揭秘餐饮合作背后的双赢奥秘。 一、资源共享&#x…

go-redis 封装事件-client封装模型、批量数据处理的导出器设计

一、redis-go的封装实践-client模型 // Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file.package storageimport ("context&q…