目录

一.Clonable接口

实现步骤:

完整代码:

 二.深拷贝

实现步骤:

完整代码:

浅拷贝与深拷贝的对比

使用场景建议


 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是对象复制的两种方式,主要区别在于对对象内部引用类型字段的处理方式不同。

  • 浅拷贝:仅复制对象本身及其基本类型字段的值,对于引用类型字段,复制的是引用地址(即新对象和原对象共享同一块内存)。
  • 深拷贝:完全复制对象及其所有字段(包括引用类型字段),新对象与原对象不共享任何内存,彼此独立。

 一.Clonable接口

实现步骤:

①创建两个类

public class Test1 {public static void main(String[] args) {Person person1 = new Person(10,"zhangsan");//Person person2 = person1.clone();//最开始点不出来}
}
public class Person {public int age;public String name;public Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}
}

②通过 person1 调用 Object类 的 clone 方法 会失败

③重写 Object类 的 clone 方法

( Alt+Insert  → Generate → Override Methods → clone() )

④调用 重写 的 clone 方法 的返回值是Object类型,需要强转为(Person)

⑤现在运行会有一个异常

解决方法:

  • throws CloneNotSupportedException  ( 该内容在重写的clone()方法中 ) 
  • 复制到main方法的后面

⑥现在代码虽然不会报错,但是还会有异常(不支持克隆)

解决方法:在person类 后面加上一个接口(标记接口)


完整代码:

public class Person implements Cloneable {public int age;public String name;public Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}@Overrideprotected Object clone()throws CloneNotSupportedException {return super.clone();}
}
public class Test1 {public static void main(String[] args)throws CloneNotSupportedException {Person person1 = new Person(10,"zhangsan");Person person2 = (Person) person1.clone();//最开始点不出来}
}


 二.深拷贝

实现步骤:

①创建一个类,包含 Clonable接口 和 clone() 方法

public class Money implements Cloneable{public double money = 9.9;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

并且在Person类中实例一个 Money对象 :m 

原理:

  • 通过改变 person2.m.money ,看 person1.m.money 是否被修改 
  • 如果改变 person2.m.money ,person1.m.money也被修改,那么就是浅拷贝,反之则为深拷贝

②再次重写Person类中的clone() 方法

    protected Object clone()throws CloneNotSupportedException {//return super.clone();Person tmp = (Person) super.clone();tmp.m = (Money) this.m.clone();return tmp;}

③进行调试

public class Test1 {public static void main(String[] args)throws CloneNotSupportedException {Person person1 = new Person(10,"zhangsan");Person person2 = (Person) person1.clone();//最开始点不出来System.out.println("修改前:"+person1.m.money);System.out.println("修改前:"+person2.m.money);person2.m.money = 99.99;System.out.println("修改后:"+person1.m.money);System.out.println("修改后:"+person2.m.money);}
}


完整代码:

public class Test1 {public static void main(String[] args)throws CloneNotSupportedException {Person person1 = new Person(10,"zhangsan");Person person2 = (Person) person1.clone();//最开始点不出来System.out.println("修改前:"+person1.m.money);System.out.println("修改前:"+person2.m.money);person2.m.money = 99.99;System.out.println("修改后:"+person1.m.money);System.out.println("修改后:"+person2.m.money);}
}
public class Person implements Cloneable {public int age;public String name;public Money m = new Money();public Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}@Overrideprotected Object clone()throws CloneNotSupportedException {//return super.clone();Person tmp = (Person) super.clone();tmp.m = (Money) this.m.clone();return tmp;}
}
public class Money implements Cloneable{public double money = 9.9;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}


浅拷贝与深拷贝的对比

特性浅拷贝深拷贝
复制范围仅复制对象本身和基本类型字段复制对象及其所有引用类型字段
内存占用低(共享引用类型字段)高(完全独立)
修改影响修改引用类型字段会影响原对象修改引用类型字段不影响原对象
实现复杂度简单复杂(需递归处理引用类型)

使用场景建议

  • 浅拷贝:适用于对象内部没有引用类型字段,或引用类型字段不可变(如String)。
  • 深拷贝:适用于对象内部有可变引用类型字段,且需要完全独立副本的场景(如缓存、状态快照等)

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

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

相关文章

accelerate 在Pycham中执行的设置方法

背景 使用 accelerate 进行分布式代码训练时,需要在pycharm中进行调试,此时需要在pycharm中运行。 终端执行命令 # *[Specify the config file path and the GPU devices to use] export CUDA_VISIBLE_DEVICES0# *[Specify the config file path] expo…

探索量子计算与法律理论的交叉领域

文章目录 前言 一、引言 二、内容 (一)知识产权 (二)隐私与安全 (三)责任认定 (四)证据与证明 (五)法律推理与决策 三、结论 总结 前言 随着量子计算技术的突破性发展,其引发的法律范式重构问题日益凸显。乌兹别克斯坦学者伊索姆别克・阿卜迪哈基莫夫于2024年在《量…

js迭代器

文章目录前言实现原理:调用迭代器自制迭代器前言 迭代器是 JSt 中一种特殊的对象,它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。 可以遍历的数据结构包括:数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器…

chainlink VRF中文教程(含mock),解决error: Arithmetic Underflow in createSubscription

⸻我使用的版本:chainlink-brownie-contracts version:1.3.0⸻1. Import 相关包 ,,, import {VRFConsumerBaseV2Plus} from "chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol"; import {VRFV2PlusClient} from "chainlink/contract…

非线性优化框架CasADi工具箱求解最优控制问题OCP

CasADi是一个开源的Python/MATLAB库,主要用于数值优化,特别是最优控制问题。它提供了一个易于使用的符号框架,用于处理和生成表达式,以及高效地生成导数信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口台式显示器:LDR6021引领新潮流

Type-C单口便携显示器LDR6021是市场上一种新兴的显示设备,以下是对其的详细介绍一、主要特点 便携性:LDR6021采用了Type-C接口作为数据传输和供电接口,这种设计使得它能够与各种支持Type-C接口的设备无缝连接,如笔记本电脑、智能手机、平板电…

在翻译语义相似度和会议摘要相似度评估任务中 ,分类任务 回归任务 生成任务区别

在翻译语义相似度(Translation Semantic Similarity)和会议摘要相似度(Meeting Summary Similarity)等任务中,通常会根据任务的目标和输出形式,将其划分为三类常见的任务类型:1. 分类任务定义&a…

UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理

UGUI 性能优化系列:第一篇——基础优化与资源管理 UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理 UGUI 性能优化系列:第三篇——渲染与像素填充率优化 UGUI 性能优化系列:第四篇——高级优化与注意事项 在 UGUI 性能优化…

企业开发转型 | 前端AI化数字化自动化现状

文章目录前端AI化数字化自动化发展现状引言调研背景与目的调研范围与方法前端AI化技术现状与工具生态主流AI工具分类与能力矩阵工具能力对比分析关键能力指标深度解析大模型技术成熟度评估前端AI化核心应用场景与人力优化路径代码生成与自动化开发设计到代码全链路自动化自动化…

Mysql(运维-日志)

黑马mysql笔记 最好开两个窗口,一个用于mysql命令,一个用于liunx命令 目录 错误日志 二进制日志 介绍 日志格式 mysq默认二进制日志文件为ROW 日志查看 二进制日志查看命令 默认日志文件格式下查看日志内容 更改日志文件格式查看日志内容 日志…

RabbitMQ:解锁高效消息传递的密码[特殊字符]

目录 一、RabbitMQ 核心概念 1.1整体框架 1.2元素详解 1.2.1 生产者(Producer)&消费者(Consumer) 1.2.2 交换机(Exchange) ①fanout (广播型) ②direct (直连型…

StarRocks × MinIO:打造灵活高效的存算分离方案

“存算分离”(Decoupled Storage and Compute)是一种在现代数据系统中被广泛采用的架构设计。它将计算和存储解耦,使二者可以独立扩展,提升资源利用率并降低运维成本。StarRocks 从 3.0 版本开始支持这一架构,允许用户…

R语言的分位数回归实践技术高级应用

回归是科研中最常见的统计学研究方法之一,在研究变量间关系方面有着极其广泛的应用。由于其基本假设的限制,包括线性回归及广义线性回归在内的各种常见的回归方法都有三个重大缺陷:(1)对于异常值非常敏感,极少量的异常值可能导致结…

Tomcat的部署、单体架构、session会话、spring

一、Tomcat的部署①②③④⑤二.web项目在tomcat服务中如何运行:1.web项目源码部署在服务器的webapps目录里面2.将web项目打包(war),部署在服务器的webapps目录里面。三 单体架构和前后端分离单体架构是将所有功能模块(包括前端界面、后端逻辑、数据库交互…

海康威视视觉算法岗位30问及详解

海康威视视觉算法岗位30问及详解 前言 视觉算法工程师是人工智能领域的热门岗位,尤其在安防、自动驾驶、工业检测等行业有着广泛应用。海康威视作为行业龙头,对视觉算法岗位的要求较高,面试问题既考察基础理论,也关注工程实现。本…

14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀

文章目录 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀 指令微调格式:Alpaca Format 深度解析 14.3.1 Alpaca 格式诞生背景与技术价值 14.3.2 Alpaca 格式结构解析 14.3.3 实战 Dolly-15K 数据转 Alpaca 格式 14.3.4 Alpaca 格式的工程化实践 14.3.5 格式扩展与挑战应…

42.sentinel实现线程隔离

线程隔离有两种实现方式: 1.线程池隔离 优点: 1.支持主动超时,线程池中的线程都是可控的,可以停掉某个线程。 2.支持异步调用,每个请求都是一个独立的线程,线程之间不受影响。 缺点: 线程的额外开销比较大 适用场景: 低扇出(一个微服务,不会依赖很多微服务)…

【过拟合和欠拟合】——深度学习.全连接神经网络

目录 1 概念认知 1.1 过拟合 1.2 欠拟合 1.3 如何判断 2 解决欠拟合 3 解决过拟合 3.1 L2正则化 3.1.1 数学表示 3.1.2 梯度更新 3.1.3 作用 3.1.4 代码实现 3.2 L1正则化 3.2.1 数学表示 3.2.2 梯度更新 3.2.3 作用 3.2.4 与L2对比 3.2.5 代码实现 3.3 Drop…

Java设计模式之行为型模式(备忘录模式)应用场景分析

最近看到一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 一、用户交互与编辑操作 文本编辑器撤销/重做 场景描述:用户编辑文档时,可通过CtrlZ撤销误操作,或通过Ctr…

5.Java的4个权限修饰符

1.private(私有访问权限)最严格的访问修饰符,它限定被修饰的成员仅能在声明它的当前类内部访问。其他任何外部类都无法直接访问该成员。作用:强制封装,确保类内部实现细节的隐藏性和数据安全性2.默认权限(包…