区别就在于是否对对象中的引用变量所指向的对象进行拷贝。

1.浅克隆/浅复制/浅拷贝

  浅拷贝是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,没有对引用指向的对象进行拷贝。

2.深克隆/深复制/深拷贝

  深拷贝是指在拷贝对象时,同时会对引用指向的对象进行拷贝。

示例代码:

 import java.util.Date;

 class Wife implements Cloneable {
private String name;
private Date birthday; public Wife(){
} public Wife(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
} public Date getBirthday(){
return birthday;
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public Object clone() throws CloneNotSupportedException {
return super.clone();
} public String toString() {
return "Wife [name=" + name + ", birthday=" + birthday + "]";
} } class Husband implements Cloneable {
private String name;
private Wife wife; public Husband(){
} public Husband(String name, Wife wife) {
this.name = name;
this.wife = wife;
} public Wife getWife() {
return wife;
} public void setWife(Wife wife) {
this.wife = wife;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} /**
* 浅克隆一个对象
* @throws CloneNotSupportedException
*/
public Object shallowClone() throws CloneNotSupportedException {
return super.clone();
}
/**
* 利用串行化深克隆一个对象,把对象以及它的引用读到流里,在写入其他的对象
* @return
* @throws Exception
*/
public Object deepClone() throws Exception {
Husband husband = (Husband) super.clone();
husband.wife = (Wife) this.wife.clone();
return husband;
}
} public class Test {
public static void main(String[] args) throws Exception{
//浅克隆
Wife w1 = new Wife("曹夫人", new Date());
Husband h1 = new Husband("曹先生", w1);
Husband h2 = (Husband) h1.shallowClone(); System.out.println("原型对象:" + h1.getName() + "--" + h1.getWife());
System.out.println("克隆对象:" + h2.getName() + "--" + h2.getWife()); w1.setName("张夫人"); System.out.println("\n--------------------------修改克隆对象的属性值后---------------------------\n"); System.out.println("原型对象:" + h1.getName() + "--" + h1.getWife());
System.out.println("克隆对象:" + h2.getName() + "--" + h2.getWife()); System.out.println("\n---------------------------------------------------------------------\n"); //深克隆
Wife w2 = new Wife("曹夫人", new Date());
Husband h3 = new Husband("曹先生", w2);
Husband h4 = (Husband) h3.deepClone(); System.out.println("原型对象:" + h3.getName() + "--" + h3.getWife());
System.out.println("克隆对象:" + h4.getName() + "--" + h4.getWife()); w2.setName("张夫人"); System.out.println("\n--------------------------修改克隆对象的属性值后---------------------------\n"); System.out.println("原型对象:" + h3.getName() + "--" + h3.getWife());
System.out.println("克隆对象:" + h4.getName() + "--" + h4.getWife()); }
}

控制台输出:

原型对象:曹先生--Wife [name=曹夫人, birthday=Mon Jan 15 18:00:35 CST 2018]
克隆对象:曹先生--Wife [name=曹夫人, birthday=Mon Jan 15 18:00:35 CST 2018] --------------------------修改克隆对象的属性值后--------------------------- 原型对象:曹先生--Wife [name=张夫人, birthday=Mon Jan 15 18:00:35 CST 2018]
克隆对象:曹先生--Wife [name=张夫人, birthday=Mon Jan 15 18:00:35 CST 2018] --------------------------------------------------------------------- 原型对象:曹先生--Wife [name=曹夫人, birthday=Mon Jan 15 18:00:35 CST 2018]
克隆对象:曹先生--Wife [name=曹夫人, birthday=Mon Jan 15 18:00:35 CST 2018] --------------------------修改克隆对象的属性值后--------------------------- 原型对象:曹先生--Wife [name=张夫人, birthday=Mon Jan 15 18:00:35 CST 2018]
克隆对象:曹先生--Wife [name=曹夫人, birthday=Mon Jan 15 18:00:35 CST 2018]

浅谈浅克隆(shallow clone)和 深克隆(deep clone)的更多相关文章

  1. Java:浅克隆(shallow clone)与深克隆(deep clone)

    Summary 浅克隆与深克隆对于JavaSE来说,是个难度系数比较低的概念,但不应该轻视它. 假设一个场景:对于某个list,代码里并没有任何对其的直接操作,但里面的元素的属性却被改变了,这可能就涉 ...

  2. 浅谈Javascript 中几种克隆(clone)方式

    clone就是把原来的东西原样复制一份,新复制的东西和以前的东西没有任何关系 一:在Javascript里,如果克隆对象是基本类型,我们直接赋值就可以了: var sStr = "kingw ...

  3. Deep Clone 常用方式总结

    Deep Clone Example 总结 Deep Clone 一般有如下几种实现方式: 纯手工每个类实现赋值 (ps: 不做介绍,一般都不想这么玩) 序列化和反序列化 纯反射 emit 或 Exp ...

  4. 浅谈Java中的深克隆和浅克隆(阿里面试)

    在最近的秋招中,阿里和多益网络都问到了这个问题,虽然很简单,但是我还是想总结一下,感兴趣的可以看一下我的个人博客网站(Spring+MyBatis+redis+nginx+mysql)(适合菜鸟),最 ...

  5. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  6. JAVA深复制(深克隆)与浅复制(浅克隆)

    1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. 1. ...

  7. 转:浅谈深度学习(Deep Learning)的基本思想和方法

    浅谈深度学习(Deep Learning)的基本思想和方法  参考:http://blog.csdn.net/xianlingmao/article/details/8478562 深度学习(Deep ...

  8. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第三周:浅层神经网络(Shallow neural networks) -课程笔记

    第三周:浅层神经网络(Shallow neural networks) 3.1 神经网络概述(Neural Network Overview) 使用符号$ ^{[

  9. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

随机推荐

  1. hdu 3032 Nim or not Nim? sg函数 难度:0

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. js 滚到页面顶部

    一.滚到顶部,且滚动中,用户滚动鼠标无效 <style> .div1, .div2, .div3, .div4 { height: 400px; width: 400px; } .div1 ...

  3. 转载-lvs官方文档-Linux服务器集群系统(二)

    Linux服务器集群系统(二) LVS集群的体系结构 章文嵩 (wensong@linux-vs.org) 2002 年 4 月 本文主要介绍了LVS集群的体系结构.先给出LVS集群的通用体系结构,并 ...

  4. 2018.11.16 RX- IC

    1. IC内部组成: Reference Oscillator:基准参考晶振-后续会放大32 倍 Comparator:比较器,输出RF信号 control logic:控制晶振倍频,控制LF,pow ...

  5. Linux下的网络设定

    一.IP相关介绍 1.IP是internet protocal的简称,也叫网络进程. 2.ipv4全称internet protocal version 4.它是由32个二进制组成:改为十进制的话,一 ...

  6. js的事件循环机制和任务队列

    上篇讲异步的时候,提到了同步队列和异步队列的说法,其实只是一种形象的称呼,分别代表主线程中的任务和任务队列中的任务,那么此篇我们就来详细探讨这两者. 一.来张图感受一下 如果看完觉得一脸懵逼,请继续往 ...

  7. python3精简笔记(三)——高级特性

    Python中 1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 切片 取一个list或tuple的部分元素是非常常见的操作.Python提供了切片(Slice)操作符 L ...

  8. Python环境准备(安装python解释器)

    上篇文章介绍了Python的相关知识,本章就开始着手操作,创建第一个Python程序,在这之前,首先需要配置Python的运行环境,也就是安装python解释器 ------------- 完美的分割 ...

  9. rabbitMQ高可用

    镜像模式 镜像模式和普通模式的区别就是,队列的数据都镜像了一份到所有的节点上.这样任何一个节点失效,不会影响整个集群的使用. 在实现上,mirror queue内部有一套选举算法,会选出一个maste ...

  10. oracle 未明确定义错误

    select sysuser1.* from (select sysuser2.*, rownum rownum_temp from (select yycgdmx.id yycgdmxid, -- ...