深克隆和浅克隆

1.克隆

在这里插入图片描述

克隆是指创建对象的一个副本,使副本具有与原始对象相同的属性和状态。
而克隆又分深克隆和浅克隆。

2.浅克隆

在这里插入图片描述

浅克隆:只会把原对象中类型为值的属性复制一份,然后引用数据类型就把它们在内存中的地址复制过去
比如一个对象有

 	public int age;public String name;public int[] arr;public Address address;

这时候浅拷贝出来了一个对象,改变这个克隆对象的age和name之后,当通过set方法改变了克隆对象的age和name,克隆对象的age和name和原对象就不同
如果试图改变arr或者address的话,那么就原对象也会跟着改变,因为引用对象拷贝的只是地址
下面看代码示例

class Address{public String city;public String getCity() {return city;}public void setCity(String city) {this.city = city;}
}
class Human implements Cloneable{public int age;public String name;public Address address;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Object clone() throws CloneNotSupportedException {return super.clone();}
}
public class Test15 {public static void main(String[] args) throws CloneNotSupportedException {Address address=new Address();address.setCity("北京");Human human=new Human();human.setAge(10);human.setName("小白");human.setAddress(address);System.out.println("克隆前:");System.out.println(human.getName());System.out.println(human.getAge());System.out.println(human.getAddress().getCity());System.out.println("===============================================");Human humanClone= (Human) human.clone();humanClone.setName("大白");humanClone.setAge(20);address.setCity("上海");humanClone.setAddress(address);System.out.println("克隆后:");System.out.println(humanClone.getName());System.out.println(humanClone.getAge());System.out.println(humanClone.getAddress().getCity());//下面这行代码的结果你会发现原对象的city也变成上海了System.out.println(human.getAddress().getCity());System.out.println("===============================================");System.out.println("克隆后的引用类型对比");System.out.println("原对象:"+human.getAddress().getCity());System.out.println("拷贝对象:"+humanClone.getAddress().getCity());System.out.println("===============================================");System.out.println("克隆后的基本数据类型对比");System.out.println("原对象:"+human.getName());System.out.println("原对象:"+human.getAge());System.out.println("拷贝对象:"+humanClone.getName());System.out.println("拷贝对象:"+humanClone.getAge());}
}

输出结果是
在这里插入图片描述

3.深克隆

深克隆:将原对象的所有类型,都拷贝一份。
在这里插入图片描述
深克隆的话,如果你修改arr或者address的话,原对象不会跟着改变了
下面看代码

class Address implements Cloneable{public String city;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public Object clone() throws CloneNotSupportedException {return super.clone();}
}
class Human implements Cloneable{public int age;public String name;public Address address;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Object clone() throws CloneNotSupportedException {Human newClone= (Human) super.clone();newClone.address= (Address) address.clone();return newClone;}
}
public class Test15 {public static void main(String[] args) throws CloneNotSupportedException {Address address=new Address();address.setCity("北京");Human human=new Human();human.setAge(10);human.setName("小白");human.setAddress(address);System.out.println("克隆前:");System.out.println(human.getName());System.out.println(human.getAge());System.out.println(human.getAddress().getCity());System.out.println("===============================================");Human humanClone= (Human) human.clone();humanClone.setName("大白");humanClone.setAge(20);Address addressClone= (Address) address.clone();addressClone.setCity("上海");humanClone.setAddress(addressClone);System.out.println("克隆后:");System.out.println(humanClone.getName());System.out.println(humanClone.getAge());System.out.println(humanClone.getAddress().getCity());System.out.println("===============================================");System.out.println("克隆后的引用类型对比");System.out.println("原对象:"+human.getAddress().getCity());System.out.println("拷贝对象:"+humanClone.getAddress().getCity());System.out.println("===============================================");System.out.println("克隆后的基本数据类型对比");System.out.println("原对象:"+human.getName());System.out.println("原对象:"+human.getAge());System.out.println("拷贝对象:"+humanClone.getName());System.out.println("拷贝对象:"+humanClone.getAge());}
}

运行结果只有下图红色圈圈改变了
在这里插入图片描述
代码的修改为下面几个图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Rust:性能优异的异步并发库 Tokio

一、Tokio 简介 Tokio是一个开源的异步运行时库,专为编写异步IO应用而设计。它提供了一种简单而安全的方式来编写异步代码,允许开发者无缝切换不同类型的异步运行时,并提供了统一的接口用于实现不同的功能,如网络IO、文件IO、数据…

我终于解决MathPage.wll文件找不到问题|(最新版Word上亲测)运行时错误,53’: 文件未找到:athPage.WLL

1、问题症状: 运行时错误,53’: 文件未找到:athPage.WLL 2、 解决方案 第一步 首先我们要先找到MathType安装目录下MathPage.wll文件,直接在此电脑中搜索MathPage.wll,找到文件所在位置。 第二步 打开Word文件&#xff0c…

Matplotlib进阶学习:基于Matplotlib实现设置Times New Roman字体

Matplotlib进阶学习:基于Matplotlib实现设置Times New Roman字体 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f4…

求区间的最大值(RMQ、线段树)

题目描述: 有n个数,给你m个询问,每次询问给你A,B个数,要求你编写程序求出[A,B]这个区间中的最大值。 输入格式: 第一行一个整数 N表示数字的个数。 接下来一行为 N个数,表示数字序列。 第三…

Git指令reset的参数soft、mixed与hard三者之间的区别

主要内容 reset默认不写参数,与使用mixed参数含义一样 为了描述简洁,使用下图说明: #mermaid-svg-LtChquRXlEV1j6og {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LtChquRXlEV1j…

实现简易可视化拖拽生成页面

1.背景 由于一些简单、重复的页面,需要开发,会耗费大量人力和物力。因此一般会利用低代码平台,进行拖拽生成,下面就是实现简易可视化拖拽生成页面 2 简易可视化拖拽生成页面具体实现 2.1 整体页面布局 整个页面分为顶栏、内容区…

react native使用TS实现路由

一、入口文件app.jsx的配置 入口文件最好还是要保留jsx import { NavigationContainer } from react-navigation/native; import { navigationRef } from "./src/views/RootNavigation";const App () > {return&#xff08;<NavigationContainer ref{navigat…

递增三元组 刷题笔记

题意为 若存在 a中的数小于b中的数&#xff0c;b中的数小于c中的数 则该数算一种方案 思路 暴力模拟优化 两层循环遍历即可 从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可 那么第一层和第三层是对称的 我们有没有可能再去掉一层循环 只做一次遍历 …

238.除自身以外数组的乘积

题目&#xff1a;给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且…

java后端修改日期格式

有了他再也不用加JsonFormat了 第一步继承WebMvcConfigurationSupport类 实现其中方法 package com.sky.config;import com.sky.interceptor.JwtTokenAdminInterceptor; import com.sky.interceptor.JwtTokenUserInterceptor; import com.sky.json.JacksonObjectMapper; impo…

JS原型链的面试题

题目1 function Person(name) {this.name name; }Person.prototype.greet function() {console.log(Hello, my name is this.name); };function Student(name, grade) {Person.call(this, name);this.grade grade; }Student.prototype Object.create(Person.prototype);…

linux系统容器搭建redis集群

容器搭建redis集群 安装redis集群三主三从redis集群搭建主从容错切换迁移数据读写存储容错切换迁移 主从扩容主从缩容 安装redis集群 三主三从redis集群搭建 cluster集群模式 哈希槽分区进行亿级数据存储关闭防火墙&#xff0c;启动docker systemctl start docker新建6个redi…

高项--价值驱动的项目管理知识体系

说要参加软考已经过去两周了&#xff0c;到现在也没啥成果&#xff0c;今天决定还是动手记录小一些东西吧&#xff0c;也方便下次打开手机的时候可以查看记忆。总体上看可以分为三个部分&#xff1a;信息技术、项目管理、法律法规&#xff0c;而项目管理里面最终要的就是这个项…

Oracle 12c dataguard查看主备库同步情况的新变化

导读 本文介绍Oracle 12c dataguard在维护方面的新变化 前提&#xff1a;主库备库的同步是正常的。 1、主库上查看archive Log list SYScdb1> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination…

JMM(Java Memory Model)内存模型

Java内存模型&#xff0c;规范了计算机内存与java虚拟机之间的协调工作&#xff0c;即规定了 将java 虚拟机中的变量存储到内存中和从内从中取出来的内存细节。 Java内存模型中规定了所有的变量都存储在内存中&#xff0c;每条线程还有自己的工作内存&#xff0c;线程对变量的…

【SpringCloud微服务实战03】Nacos 注册中心

一、Nacos安装 官方文档安装Nacos教程:Nacos 快速开始 这里安装的是1.4.7版本,安装之后访问http://127.0.0.1:8848/nacos 管理界面如下:(用户名:nacos,密码:nacos) 二、Nacos服务注册和发现 1、在父工程中配置文件pom.xml 中添加spring-cloud-alilbaba的管理依赖:…

如何快速制作电商效果图?

我们都知道&#xff0c;做电商&#xff0c;你的产品效果是很重要&#xff0c;有些产品只要看一眼&#xff0c;消费者就想着加入购物车或者购买。 想快速制作电商效果图&#xff0c;我们可以借助以下几个方法。 1、使用电商模版 网上有很多免费和付费的电商效果图模板,&#x…

基于RK3588+Codesys+Xenomai的ARM+LINUX实时硬件平台的软PLC解决方案

产品概述 公司推出基于瑞芯微RK3588架构的AI边缘计算主板&#xff0c;RK3588是新一代国产旗舰高性能64位八核处理器&#xff0c;采用8nm工艺&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6…

顺序表详解

顺序表是最简单的一种数据结构之一&#xff0c;它的本质上就是数组&#xff0c;我们将顺序表分为静态和动态的两种形式&#xff0c;静态顺序表只能存储有限个数据&#xff0c;而动态顺序表可以根据自己的需求来开辟空间存储数据。 下面是静态顺序表的结构&#xff0c;本质上就是…

一文了解Spring的SPI机制

文章目录 一文了解Spring的SPI机制Java SPIServiceLoader Spring SPISpringboot利用Spring SPI开发starter 一文了解Spring的SPI机制 Java SPI SPI 全称 Service Provider Interface &#xff0c;是 Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用…