深拷贝与浅拷贝

一般来说,拷贝的类型分为 深拷贝与浅拷贝。

|—————————————————————————————|

| 深拷贝:引用对象的值等信息,复制一份一样的。             |

| 浅拷贝:只复制引用,另一处修改,你当下的对象也会修改。   |

|—————————————————————————————|

网上有这样的描述,以上描述不科学

从字面上理解更好。
浅拷贝---拷贝的级别浅。

深拷贝---拷贝级别更深。

具体呢?

浅拷贝---能复制变量,如果对象内还有对象,则只能复制对象的地址

深拷贝---能复制变量,也能复制当前对象的 内部对象

代码范例

public class mytest {public static void main(String[] args) {Parent item1 = new Parent("john", 10);Parent item2 = item1.clone();System.out.println("parent1 = " + item1.toString());System.out.println("parent2 = " + item2.toString());}public static class Parent implements Cloneable{String name = "";int age = 0;Parent (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}@Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Parent[" + name + "===" + age + "];";}}
}

测试结果:

parent1 = Parent[john===10];
parent2 = Parent[john===10];

Parent1被复制了一份。

修改下main函数

再执行一次。

测试结果:

发现parent1被修改了,但是parent2并未收到影响。

再修改一下.

添加一个内部类son,并加到parent里头去。

public class mytest {。。。。。。。。    public static class Parent implements Cloneable{String name = "";int age = 0;Son theson;Parent (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}public void setSon(Son s) {theson = s;}@Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Parent[" + name + "===" + age + "];" + "---Son:"+ (theson != null ? theson.name : "null");}}public static class Son implements Cloneable {String name = "";int age = 0;Son (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}@Overrideprotected Son clone() {Son clone = null;try {clone = (Son) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Son[" + name + "===" + age + "];";}}
}
<span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">
</span>

看main的修改

先copy再设置。

测试结果:

可以看到parent1与parent2中的son都变了。

可见,浅拷贝---只是将 内部对象的地址保存。。。。

最后,修改一下Clone

        @Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}clone.theson = theson.clone();return clone;}

测试结果:

parent1 = Parent[alice-john===10];---Son:alice---john's son
parent2 = Parent[john===10];---Son:john'son<span style="mso-spacerun:'yes';font-family:宋体;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"> </span>

结果达到了我预计的结果。。。

小结

浅拷贝与深拷贝,一字之差,主要表明了拷贝的层次差别。

Object的clone方法,必须要实现Cloneable。

表明了,clone方法的实现要程序员自己来。。。

而深浅拷贝只是术语的区别。。。你怎么实现的就是怎么个定义。

1. 必须实现Cloneable

2. 要深拷贝,得注意对象的内部对象,也需要clone

Java基础-深拷贝和浅拷贝的区别相关推荐

  1. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  2. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...

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

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

  4. 学习Java的深拷贝和浅拷贝

    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...

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

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

  6. python 深拷贝_详解python的复制,深拷贝和浅拷贝的区别

    概述 今天主要来看看Python中的浅拷贝和深拷贝内容,这里用一个实例来说明~ 需求: 将一个列表的数据复制到另一个列表中. 思路: 使用列表[:],拿不准可以调用copy模块. 实现方法: #!/u ...

  7. c++深拷贝和浅拷贝的区别?

    c++深拷贝和浅拷贝的区别 浅拷贝 深拷贝 总结 浅拷贝 对一个已知对象进行拷贝,编译系统会自动调用一种构造函数--拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数,调用一次构造函数 ...

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

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

  9. Java基础之equals和==的区别深入解析

    Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...

最新文章

  1. java纳税服务_纳税服务系统【总结】
  2. 分位数(quantiles)、Z-score 与 F-score
  3. C#菜鸟正则表达式一
  4. java中链式调用_Java及Android中常用链式调用写法简单示例
  5. oracle 连接greenplum,Oracle通过DBLINK访问GreenPlum
  6. MySql实战篇:写一个简单的存储过程,完成订单定时任务
  7. client-error-not-possible Ubuntu连接局域网打印机
  8. Egyptian Collegiate Programming Contest (ECPC 2015)
  9. 猎人网吧的游戏更新VBS(转)
  10. gitee代码管理仓库管理代码,更简单地查看各阶段的代码变动
  11. 用PPT做的微信红包封面还可以这么玩?
  12. the connection to the server was unsuccessful(file ///android_asset/www/index.html)
  13. 【汽车安全】ISO26262概要
  14. gige相机二次开发_GigE Vision接口摄像机及其应用
  15. 淘宝直通车的打法的方法与问题分析
  16. 第十三周 任务二
  17. Kafka创建Topic出现replication factor: 2 larger than available brokers: 0 减少replication factor还是出现错误的解决办法
  18. PointNet 学习笔记
  19. 读敏捷系列之《The Art of Agile Development》
  20. 南京大学计算机夏博士,凌盛杰

热门文章

  1. Word下划线怎么打?速速get这5个实用方法!
  2. Shell 编程实践
  3. tryhackme--Overpass 2 - Hacked
  4. 如何淡化疤痕留下的黑色色素
  5. 计算机毕业设计(附源码)python幼儿园管理系统
  6. 聚类分析在用户行为中的实例_聚类分析案例
  7. 狼与狗的本质区别:从打工到老板的突破
  8. 私藏多年的vscode插件分享,让你成为一个高效开发的程序员
  9. 【软件实现实验三:迷宫】
  10. 小程序源码:端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐