文章目录

  • 一、拷贝简介
    • 1.1 引用拷贝
    • 1.2 对象拷贝
  • 二、浅拷贝
    • 2.1 定义
  • 三、深拷贝
    • 3.1 定义

一、拷贝简介

1.1 引用拷贝

创建一个指向对象的引用变量的拷贝

public class DemoCopy {public static void main(String[] args) {// 1. 引用拷贝:创建一个指向对象的引用变量的拷贝TempUser tempUser = new TempUser("张三",18);TempUser otherTempUser = tempUser;System.out.println(tempUser);System.out.println(otherTempUser);}
}class TempUser{private String name;private int age;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public TempUser(String name,int age){this.name = name;this.age = age;}
}

输出结果

com.TempUser@7ba4f24f
com.TempUser@7ba4f24f

结果分析

  1. 地址值相同,说明是同一对象
  2. tempUser 和 otherTempUser 只是引用
  3. 都指向了一个相同的对象,就叫做**引用拷贝
#mermaid-svg-U0gYXbrtDnOhQiWR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .error-icon{fill:#552222;}#mermaid-svg-U0gYXbrtDnOhQiWR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U0gYXbrtDnOhQiWR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U0gYXbrtDnOhQiWR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR .marker.cross{stroke:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U0gYXbrtDnOhQiWR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster-label text{fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster-label span{color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .label text,#mermaid-svg-U0gYXbrtDnOhQiWR span{fill:#333;color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .node rect,#mermaid-svg-U0gYXbrtDnOhQiWR .node circle,#mermaid-svg-U0gYXbrtDnOhQiWR .node ellipse,#mermaid-svg-U0gYXbrtDnOhQiWR .node polygon,#mermaid-svg-U0gYXbrtDnOhQiWR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U0gYXbrtDnOhQiWR .node .label{text-align:center;}#mermaid-svg-U0gYXbrtDnOhQiWR .node.clickable{cursor:pointer;}#mermaid-svg-U0gYXbrtDnOhQiWR .arrowheadPath{fill:#333333;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-U0gYXbrtDnOhQiWR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-U0gYXbrtDnOhQiWR .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster text{fill:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR .cluster span{color:#333;}#mermaid-svg-U0gYXbrtDnOhQiWR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-U0gYXbrtDnOhQiWR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

tempUser
张三,18
otherTempUser

1.2 对象拷贝

public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 对象拷贝TempUser tempUser = new TempUser("李四",18);TempUser otherTempUser = (TempUser) tempUser1.clone();System.out.println(tempUser);System.out.println(otherTempUser);}
}class TempUser implements Cloneable {private String name;private int age;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public TempUser(String name,int age){this.name = name;this.age = age;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}
}

输出结果

com.TempUser@3b9a45b3
com.TempUser@7699a589

结果分析

  1. 地址不同,说明创建了新的对象
  2. 不是把原对象的地址赋给了一个新的引用变量,这就叫做对象拷贝
#mermaid-svg-VA7niekqAOtOgXJQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .error-icon{fill:#552222;}#mermaid-svg-VA7niekqAOtOgXJQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VA7niekqAOtOgXJQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VA7niekqAOtOgXJQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ .marker.cross{stroke:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VA7niekqAOtOgXJQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster-label text{fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster-label span{color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .label text,#mermaid-svg-VA7niekqAOtOgXJQ span{fill:#333;color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .node rect,#mermaid-svg-VA7niekqAOtOgXJQ .node circle,#mermaid-svg-VA7niekqAOtOgXJQ .node ellipse,#mermaid-svg-VA7niekqAOtOgXJQ .node polygon,#mermaid-svg-VA7niekqAOtOgXJQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VA7niekqAOtOgXJQ .node .label{text-align:center;}#mermaid-svg-VA7niekqAOtOgXJQ .node.clickable{cursor:pointer;}#mermaid-svg-VA7niekqAOtOgXJQ .arrowheadPath{fill:#333333;}#mermaid-svg-VA7niekqAOtOgXJQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VA7niekqAOtOgXJQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VA7niekqAOtOgXJQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VA7niekqAOtOgXJQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster text{fill:#333;}#mermaid-svg-VA7niekqAOtOgXJQ .cluster span{color:#333;}#mermaid-svg-VA7niekqAOtOgXJQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VA7niekqAOtOgXJQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

tempUser
李四,18
otherTempUser
李四,18

二、浅拷贝

2.1 定义

  1. 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象
  2. 即对象的浅拷贝会对对象进行拷贝,但不会复制主对象里面的对象
  3. 里面的对象: 会在原来的对象和它的副本之间共享
  4. 简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象
  5. 浅拷贝只是增加了一个指针指向已存在的内存地址
public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 浅拷贝Address address = new Address();address.setCountry("大陆");address.setProvince("天斗");TempUser tempUser2 = new TempUser();tempUser2.setName("王五");tempUser2.setAge(20);tempUser2.setAddress(address);TempUser tempUser3 = (TempUser) tempUser2.clone();System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());System.out.println("------修改地址信息后------");address.setCountry("苍穹");address.setProvince("乌坦");System.out.println(tempUser2.getName() + " | " + tempUser2.getAge() + " | " + tempUser2.getAddress().getCountry() + " | " + tempUser2.getAddress().getProvince());System.out.println(tempUser3.getName() + " | " + tempUser3.getAge() + " | " + tempUser3.getAddress().getCountry() + " | " + tempUser3.getAddress().getProvince());}
}class TempUser implements Cloneable {private String name;private int age;private Address address;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {Object object = super.clone();return object;}
}class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;}
}

输出结果

王五 | 20 | 大陆 | 天斗
王五 | 20 | 大陆 | 天斗
------修改地址信息后------
王五 | 20 | 苍穹 | 乌坦
王五 | 20 | 苍穹 | 乌坦

结果分析

  1. 两个引用 tempUser2tempUser3 指向不同的两个对象
  2. 两个引用 tempUser2tempUser3 中的两个address引用指向的是同一个对象,所以说明是浅拷贝
#mermaid-svg-BVrDtp2CwzRjaYUn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .error-icon{fill:#552222;}#mermaid-svg-BVrDtp2CwzRjaYUn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BVrDtp2CwzRjaYUn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BVrDtp2CwzRjaYUn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn .marker.cross{stroke:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BVrDtp2CwzRjaYUn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster-label text{fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster-label span{color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .label text,#mermaid-svg-BVrDtp2CwzRjaYUn span{fill:#333;color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .node rect,#mermaid-svg-BVrDtp2CwzRjaYUn .node circle,#mermaid-svg-BVrDtp2CwzRjaYUn .node ellipse,#mermaid-svg-BVrDtp2CwzRjaYUn .node polygon,#mermaid-svg-BVrDtp2CwzRjaYUn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BVrDtp2CwzRjaYUn .node .label{text-align:center;}#mermaid-svg-BVrDtp2CwzRjaYUn .node.clickable{cursor:pointer;}#mermaid-svg-BVrDtp2CwzRjaYUn .arrowheadPath{fill:#333333;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BVrDtp2CwzRjaYUn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BVrDtp2CwzRjaYUn .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster text{fill:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn .cluster span{color:#333;}#mermaid-svg-BVrDtp2CwzRjaYUn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BVrDtp2CwzRjaYUn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

tempUser2
王五,20
tempUser3
王五,20
address

三、深拷贝

3.1 定义

  1. 深拷贝是一整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存
  2. 当对象和它所引用的对象一起拷贝时即发生深拷贝
  3. 深拷贝相比于浅拷贝速度较慢并且花销较大
  4. 简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍
  5. 深拷贝是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存
  6. 使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误
public class DemoCopy {public static void main(String[] args) throws CloneNotSupportedException{// 深拷贝Address address1 = new Address();address1.setCountry("遮天");address1.setProvince("天庭");TempUser tempUser4 = new TempUser();tempUser4.setName("赵六");tempUser4.setAge(18);tempUser4.setAddress(address1);TempUser tempUser5 = (TempUser) tempUser4.clone();System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());System.out.println("------修改地址信息后------");address1.setCountry("完美");address1.setProvince("世界");System.out.println(tempUser4.getName() + " | " + tempUser4.getAge() + " | " + tempUser4.getAddress().getCountry() + " | " + tempUser4.getAddress().getProvince());System.out.println(tempUser5.getName() + " | " + tempUser5.getAge() + " | " + tempUser5.getAddress().getCountry() + " | " + tempUser5.getAddress().getProvince());}
}class TempUser implements Cloneable {private String name;private int age;private Address address;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;}public Address getAddress(){return address;}public void setAddress(Address address){this.address = address;}public TempUser(){}public TempUser(String name,int age){this.name = name;this.age = age;}public TempUser(String name,int age,Address address){this.name = name;this.age = age;this.address = address;}// 重写Clone方法,将访问权限修改为publicpublic Object clone() throws CloneNotSupportedException {// 浅复制/*Object object = super.clone();return object;*/// 深复制TempUser tempUser = (TempUser) super.clone();tempUser.setAddress((Address) tempUser.getAddress().clone());return tempUser;}
}class Address implements Cloneable{private String country;private String province;public String getCountry(){return country;}public void setCountry(String country){this.country = country;}public String getProvince(){return province;}public void setProvince(String province){this.province = province;}public Address(){}public Address(String country,String province){this.country = country;this.province = province;}public Object clone() throws CloneNotSupportedException {// 浅复制Object object = super.clone();return object;}
}

输出结果

赵六 | 18 | 遮天 | 天庭
赵六 | 18 | 遮天 | 天庭
------修改地址信息后------
赵六 | 18 | 完美 | 世界
赵六 | 18 | 遮天 | 天庭

结果分析

  1. 两个引用 tempUser4tempUser5 指向不同的两个对象
  2. 两个引用 tempUser4tempUser5 中的两个 address1 引用指向的是两个对象
  3. address1 对象的修改只能影响 tempUser4 对象,所以说是深拷贝

java深入理解深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝相关推荐

  1. java -- 深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝

    文章目录 1. 深拷贝和浅拷贝的区别 1.1 浅拷贝实例 1.1.1 测试1 直接赋值 1.1.2 测试2 改变源对象的值 1.2 深拷贝实例 `这是用于深拷贝的测试类` 1.2.1 方法一: 构造函 ...

  2. Java 深入理解深拷贝和浅拷贝区别

    title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...

  3. Java基础-深拷贝和浅拷贝的区别

    深拷贝与浅拷贝 一般来说,拷贝的类型分为 深拷贝与浅拷贝. |-----------------------------| | 深拷贝:引用对象的值等信息,复制一份一样的.             | ...

  4. 简单理解深拷贝和浅拷贝的区别

    下面搜集的写的比较好的博客 大嘎可以看一下 https://www.cnblogs.com/mikeCao/p/8710837.html 简单来说 浅拷贝和深拷贝最主要的区别:否是开辟的新的内存 也就 ...

  5. java深入理解浅拷贝和深拷贝

    文章目录 简介 拷贝接口 使用clone导致的浅拷贝 使用clone的深拷贝 不要overridden clone 总结 简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和 ...

  6. Python中深拷贝与浅拷贝的区别?

    往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...

  7. C++深拷贝与浅拷贝的区别-简单易懂

    C++深拷贝与浅拷贝的区别-简单易懂 介绍 浅拷贝就比如像引用类型,而深拷贝就比如值类型. 浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同).对其中任何一个对象的改动都会影响另 ...

  8. 【C++面试问答】搞清楚深拷贝与浅拷贝的区别

    问题 深拷贝和浅拷贝的区别是面试中的常见问题之一,对于不同的编程语言,这个问题的回答可能稍有差别,下面我们就来探索一下它们之间的异同吧. 先来看看在JavaScript对象的深拷贝与浅拷贝的区别: 浅 ...

  9. 如何完美解答面试问题——深拷贝和浅拷贝的区别

    大家好,我是孤焰.今天要谈一谈在面试过程中可能被面试官提到的一个问题--深拷贝和浅拷贝的区别? 由于我也是刚刚学习编程的小白,所以此篇博文将参考了多篇博文,最后总结而成. 最近由于多门考试临近,所以博 ...

最新文章

  1. 可以不封神,但是不能不修炼——亚特兰蒂斯之神特斯拉的启示
  2. 公司内部图书管理界面原型设计图
  3. git作死之天坑记录
  4. centos6安装mysql并远程连接_如何开启phpstudy中mysql的远程连接
  5. 超3000岗位!腾讯产业互联网新年大扩招!
  6. Solr4.8.0源码分析(13)之LuceneCore的索引修复
  7. messagebox
  8. 软件测试流程(完整版)
  9. MySQL安装及使用手册
  10. edem合成运动教程
  11. python --离线识别图片中文字(easyocr)
  12. Room的基本使用(一)
  13. gridsome(三)——plugins
  14. 前端 mockjs模拟数据
  15. 理解CMMI 3级过程域非常好的例子
  16. TCX推出前沿货币债券指数
  17. 终于!疫情之下,第一批企业没能熬住面临倒闭,员工被遣散,没能等来春暖花开!...
  18. 计算机系统构成及硬件基础知识(中级软件评测师备考笔记)
  19. “道德”,究竟是保镖还是杀手?
  20. 366AP微信中可以下载企业包

热门文章

  1. day03_20170514_字符编码/文件存储/函数(一)
  2. 如何将原来Eclipse的一个工作空间设置好的界面复制到另外一个Eclipse里面
  3. echarts饼图显示比例
  4. 计算机毕设项目 python微信公众平台机器人
  5. 第七章 在网页中嵌入多媒体内容
  6. “卖惨”的悲情牌打多了,营销终将变“悲剧”
  7. 一个故事带你了解集线器、交换机与路由器
  8. H.264压缩算法详解
  9. 如何将图片的背景色去掉?怎样快速去除背景色?
  10. linux 博通wifi驱动,博通WiFi驱动