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

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. (转载) jQuery页面加载初始化的3种方法

    jQuery 页面加载初始化的方法有3种 ,页面在加载的时候都会执行脚本,应该没什么区别,主要看习惯吧,本人觉得第二种方法最好,比较简洁. 第一种: $(document).ready(functio ...

  2. LeetCode OJ:Number of Islands(孤岛计数)

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  3. 12.18 分布式系统下的session

    广义的session: 会话控制,可以理解成为一种保存key-value的机制 从key的方面来看:sessionId和token sessionId: 服务端请求客户端的时候,服务端通过setcoo ...

  4. 自己定义的Excetpion继承哪个异常有什么讲究?[待解答]

    try catch的地方需要用到一个自定义的DBException,如下: 于是我就自定义了一个DBException,继承Excetpion,以父类Exception构造器创建构造器: DBExce ...

  5. Xss测试

    <Script>alert(“XSS attack available!”);</Script>

  6. resultMap的使用

    1)属性 id:resultMap的唯一标识 type:Java实体类 2)子元素 id 一般对应数据库中该行的主键id,设置此项可提高MyBatis性能 result 映射到JavaBean的某个“ ...

  7. GPU编程自学1 —— 引言

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

  8. ARM寄存器总结:

    ARM有16个32位的寄存器(r0到r15). r15充当程序寄存器PC,r14(link register)存储子程序的返回地址,r13存储的是堆栈地址. ARM有一个当前程序状态寄存器:CPSR. ...

  9. Python 之文件上传

    基于form表单提交 # 需要指定form-data,不能直接拼键值对 可以指定name照片存在位置 views.py from django.shortcuts import render,redi ...

  10. SPOJ Favorite Dice(数学期望)

    BuggyD loves to carry his favorite die around. Perhaps you wonder why it's his favorite? Well, his d ...