Java Object浅克隆深克隆

对象克隆

把A对象的属性值完全拷贝给B对象,也叫对象拷贝,对象复制。

实现Cloneable接口,表示当前类的对象就可以被克隆,反之,表示当前类的对象就不能克隆。 
如果一个接口里面没有抽象方法,表示当前的接口是一个标记性接口。
 

  • 浅克隆

不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。

  • 深克隆

基本数据类型拷贝过来(字符串复用),引用数据类型会重新创建新的地址。

代码示例:

public class User implements Cloneable {private int id;private String username;private String password;private String path;private int[] data;public User() {}public User(int id, String username, String password, String path, int[] data) {this.id = id;this.username = username;this.password = password;this.path = path;this.data = data;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public int[] getData() {return data;}public void setData(int[] data) {this.data = data;}public String toString() {return "角色编号为:" + id + ",用户名为:" + username + "密码为:" + password + ", 游戏图片为:" + path + ", 进度:" + arrToString();}public String arrToString() {StringJoiner sj = new StringJoiner(", ", "[", "]");for (int i = 0; i < data.length; i++) {sj.add(data[i] + "");}return sj.toString();}@Overrideprotected Object clone() throws CloneNotSupportedException {//调用父类中的clone方法//相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去。//先把被克隆对象中的数组获取出来int[] data = this.data;//创建新的数组int[] newData =new int[data.length];//拷贝数组中的数据for (int i = 0; i < data.length; i++) {newData[i] = data[i];}//调用父类中的方法克隆对象User u=(User)super.clone();//因为父类中的克隆方法是浅克隆,替换克隆出来对象中的数组地址值u.data =newData;return u;}

Object是Java中的顶级父类,所有的类都直接或间接的继承于Object类。

  • toString(): 一般会重写,打印对象时打印属性。
  • equals(): 比较对象时会重写,比较对象属性值是否相同。
  • clone(): 默认浅克隆,如果需要深克隆需要重写方法或使用第三方工具类(如gson.xxx.jar)。

Objects

一个工具类,提供了一些方法去完成一些功能。

成员方法:

源码:

Objects.equals(a,b), 先比对两个对象地址是否相同,再判断调用内部equals的a是否为null,如果为null则直接返回false,不为null就继续比较属性值。

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

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

相关文章

【零基础入门VUE】在 Vue 中构建复杂表单

✍面向读者&#xff1a;所有人 ✍所属专栏&#xff1a;零基础入门VUE专栏https://blog.csdn.net/arthas777/category_12537076.html 目录 v-modelVue 中的 指令 Vue 中的组件 没有构建步骤 随着构建步骤 注册 VUE 组件 Vue 道具 VUE 中的道具声明 在 VUE 中传递 PROP…

WEB渗透—PHP反序列化(十一)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

李宏毅 自然语言处理(Voice Conversion) 笔记

前一章笔记&#xff1a;李宏毅 自然语言处理&#xff08;Speech Recognition&#xff09; 笔记 引入 什么是voice conversion&#xff1f; 输入一段声音&#xff0c;输出另一段声音&#xff0c;我们希望这两端声音&#xff1a;内容一样&#xff0c;其他方面不一样&#xff08…

C++ 递归函数 详细解析——C++日常学习随笔

1. 递归函数 1.1 递归函数的定义 递归函数&#xff1a;即在函数体中出现调用自身的函数&#xff0c;即函数Func(Type a,……)直接或间接调用函数本身&#xff1b; 递归函数&#xff1a;在数学上&#xff0c;关于递归函数的定义如下&#xff1a;对于某一函数f(x)&#xff0c;其…

ssm基于web的马病管理系统设计与实现+jsp论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;马病信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

RK3568测试tdd

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接&#xff0c;粘贴下载&#xff1b;解压到文件夹&#xff1b; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具&#xff0c;工具界面击烧写步骤如图所示&#xff1a; 推荐…

动态规划 典型例题

总结 动态规划的的四个解题步骤是&#xff1a; 定义子问题写出子问题的递推关系确定 DP 数组的计算顺序空间优化&#xff08;可选&#xff09; from functools import cache cache #缓存&#xff0c;避免重复运算 def dfs(i)->int:if 终止: return 0 #具体返回什么值要看…

C# 图标标注小工具-查看重复文件

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Windows.Forms;namespace ImageDuplicate {public partial clas…

使用Go处理HTTP GET请求

你是否曾经想过&#xff0c;当你点击一个链接或在浏览器中输入一个网址时&#xff0c;背后发生了什么&#xff1f;其实&#xff0c;这是一个小小的数据冒险之旅。而今天&#xff0c;我们将使用Go语言作为我们的冒险伙伴&#xff0c;一起去探索如何处理HTTP GET请求的神秘世界&a…

2023年度总结—你是你的年度MVP吗?

这段年度总结其实我之前就想写了&#xff0c;大概就是市赛比完之后18号的样子把&#xff0c;但是因为太懒了就一直拖到了现在哈哈&#xff0c;我思来想去&#xff0c;翻来覆去&#xff0c;彻夜难眠&#xff0c;想了想&#xff0c;还是决定把它写了吧&#xff01;毕竟&#xff0…

「微服务」微服务架构中的数据一致性

在微服务中&#xff0c;一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案&#xff0c;如果其中一个分布式流程参与者出现故障&#xff0c;我们就会面临数据不一致的风险 - 例如在未下订单的情…