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

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. [VS]VS快捷键

    VS快速跳到某一行:CTRL+G VS鼠标移动到下一个高亮处:Ctrl+Shift+上下箭头 VS转到定义后返回:Ctrl+- VS折叠全部代码:Ctrl.M+Ctrl.O VS代码格式化:Ctrl. ...

  2. ubuntu12.04+openni+nit+SensorKinect环境搭建

    一.安装openni 1.下载openni                  OpenNI-Bin-Dev-Linux-x64-v1.5.4.0.tar.bz2 2.cd ~; mkdir kinec ...

  3. COW写时复制

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  4. windows下创建文件夹链接

    mklink百度百科https://baike.baidu.com/item/mklink/566760?fr=aladdin 创建文件夹链接mklink /d "C:\Users\Admi ...

  5. jmeter测试FTP

    1.下载并运行FTP服务器软件:Quick Easy FTP Server V4.0.0.exe 2.点击右上角的绿色按钮,开启服务器,直到中间的红色按钮亮起 3.在账户管理处可以管理账号信息(用户名 ...

  6. 海思arm平台AAC音频转码cpu占用高、效率低的问题解决

    问题背景 目前市面上的大部分IPC摄像机音频输出基本都是G711.G726编码格式,而在类似于<基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控>这种业务中,都是 ...

  7. Swift中的本地化实现

    1. 确保localization中添加了多语言2. 添加localisable.strings文件 3.选择这个文件,勾选多语言即可4.打开localisable.strings文件,添加一些测试字 ...

  8. VS2010对c++11的支持情况验证

    目前仅仅测试工作中 使用的比较多的: 智能指针 shared_ptr #include <memory> std::shared_ptr<A> a(new A); ----支持 ...

  9. ios6:新特征介绍

    下面我们分别来看看这些特征的一些介绍: 1.地图     iOS6抛弃了一直用的google map,而使用了自家的地图服务.相应地,MapKit框架也自然变成和Apple自家的地图服务绑定了.随之而 ...

  10. matlab load

    参考文献:http://jingyan.baidu.com/article/fec4bce2257963f2618d8bfa.html 对应save,load 命令更加简单. load的方式有三种: ...