【Java基础】Java拷贝
2021/6/16 22:23:04
本文主要是介绍【Java基础】Java拷贝,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我是 啤酒就辣条,一个Java。
学而时习之,不亦说乎?希望通过博客的形式,总结、分享,梳理自己、帮助他人。
另外,啤酒就辣条,味道不错哦~
浅拷贝和深拷贝
浅拷贝是将基本数据类型复制一份,共用引用类型的数据。
深拷贝是在堆中完全创建一个新的对象,基本数据类型和引用数据类型都进行复制。
代码示例
浅拷贝
首先创建两个类 Father 和 Child
public class Father implements Cloneable{ private String name; private Child child; // 此处省略get、set方法 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class Child { private String name; // 此处省略get、set方法 } 复制代码
public class CopyTest { public static void main(String[] args) throws CloneNotSupportedException { Father father1 = new Father(); father1.setName("pjjlt"); Child child = new Child(); child.setName("child"); father1.setChild(child); Father father2 = (Father) father1.clone(); System.out.println("father1的名字是:"+father1.getName()); System.out.println("father2的名字是:"+father2.getName()); System.out.println("father1 Child的名字是:"+father1.getChild().getName()); System.out.println("father2 Child的名字是:"+father2.getChild().getName()); System.out.println("father1和father2的hashCode:"+(father1.hashCode() == father2.hashCode())); System.out.println("两个Child的hashCode:"+(father1.getChild().hashCode() == father2.getChild().hashCode())); father1.setName("啤酒就辣条"); father1.getChild().setName("孩子"); System.out.println("*******************更新之后*******************"); System.out.println("father1的名字是:"+father1.getName()); System.out.println("father2的名字是:"+father2.getName()); System.out.println("father1 Child的名字是:"+father1.getChild().getName()); System.out.println("father2 Child的名字是:"+father2.getChild().getName()); System.out.println("father1和father2的hashCode:"+(father1.hashCode() == father2.hashCode())); System.out.println("两个Child的hashCode:"+(father1.getChild().hashCode() == father2.getChild().hashCode())); } } // 输出结果 father1的名字是:pjjlt father2的名字是:pjjlt father1 Child的名字是:child father2 Child的名字是:child father1和father2的hashCode:false 两个Child的hashCode:true *******************更新之后******************* father1的名字是:啤酒就辣条 father2的名字是:pjjlt father1 Child的名字是:孩子 father2 Child的名字是:孩子 father1和father2的hashCode:false 两个Child的hashCode:true 复制代码
由此可见,father1和father2基本数据类型复制了,而引用数据类型公用了。
深拷贝
下面单纯修改Father和Child类,再打印看看。
public class Father implements Cloneable{ private String name; private Child child; @Override protected Object clone() throws CloneNotSupportedException { Father cloneFather = (Father) super.clone(); cloneFather.setChild((Child) this.child.clone()); return cloneFather; } } public class Child implements Cloneable{ private String name; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } // 打印结果 father1的名字是:pjjlt father2的名字是:pjjlt father1 Child的名字是:child father2 Child的名字是:child father1和father2的hashCode:false 两个Child的hashCode:false *******************更新之后******************* father1的名字是:啤酒就辣条 father2的名字是:pjjlt father1 Child的名字是:孩子 father2 Child的名字是:child father1和father2的hashCode:false 两个Child的hashCode:false 复制代码
由此可见,father1和father2的基本数据类型和引用数据类型都进行复制了。
这篇关于【Java基础】Java拷贝的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07转型传统行业避坑指南!
- 2025-01-07百万架构师第九课:源码分析:Spring 源码分析:Spring5源码分析-预习资料|JavaGuide
- 2025-01-07为你的程序精选的4个优质支付API
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型