要点:

1、浅度拷贝可以不实现Cloneable接口(自动使用Object.clone)或者不重写Cloneable的clone方法。

2、要被深度拷贝的类必须实现Cloneable接口并重写clone方法。

3、如果需要能被深度拷贝则需要在父一级对所有的非基本类型的子元素调用clone方法。

看例子:

  1. /**
  2. * 浅度clone的对象(浅拷贝)
  3. *
  4. * @author yzl
  5. */
  6. public class ShallowCloneFavorite {
  7. private String name;
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. }
  1. /**
  2. * 深度clone(深拷贝)
  3. *
  4. * @author yzl
  5. */
  6. public class DepthCloneFavorite implements Cloneable{
  7. private String name;
  8.  
  9. public String getName() {
  10. return name;
  11. }
  12.  
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16.  
  17. /* (non-Javadoc)
  18. * @see java.lang.Object#clone()
  19. */
  20. @Override
  21. protected DepthCloneFavorite clone() throws CloneNotSupportedException {
  22. return (DepthCloneFavorite)super.clone();
  23. }
  24. }

聚合类:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. /**
  5. * JAVA深浅Clone测试集成类
  6. *
  7. * @author yzl
  8. */
  9. public class Person implements Cloneable {
  10. //基础类型直接值拷贝
  11. private String type;
  12. //未实现Cloneable接口的浅拷贝对象
  13. private ShallowCloneFavorite scf;
  14. //实现了Cloneable接口的可以进行深拷贝的对象
  15. private DepthCloneFavorite dcf;
  16. //可以深度Clone的list
  17. private List<DepthCloneFavorite> dcfList;
  18.  
  19. public String getType() {
  20. return type;
  21. }
  22. public void setType(String type) {
  23. this.type = type;
  24. }
  25. public ShallowCloneFavorite getScf() {
  26. return scf;
  27. }
  28. public void setScf(ShallowCloneFavorite scf) {
  29. this.scf = scf;
  30. }
  31. public DepthCloneFavorite getDcf() {
  32. return dcf;
  33. }
  34. public void setDcf(DepthCloneFavorite dcf) {
  35. this.dcf = dcf;
  36. }
  37.  
  38. public List<DepthCloneFavorite> getDcfList() {
  39. return dcfList;
  40. }
  41. public void setDcfList(List<DepthCloneFavorite> dcfList) {
  42. this.dcfList = dcfList;
  43. }
  44.  
  45. @Override
  46. protected Person clone() throws CloneNotSupportedException {
  47. Person p = (Person)super.clone();
  48. //深拷贝Person的成员变量
  49. p.setDcf(dcf.clone());
  50. //深拷贝list
  51. if(null!=dcfList && !dcfList.isEmpty()){
  52. List<DepthCloneFavorite> copyList = new ArrayList<DepthCloneFavorite>(dcfList.size());
  53. for(DepthCloneFavorite obj : dcfList){
  54. copyList.add(obj.clone());
  55. }
  56. p.setDcfList(copyList);
  57. }
  58. return p;
  59. }
  60.  
  61. /**
  62. *
  63. * 显示对象里的数据
  64. *
  65. * @see [相关类/方法](可选)
  66. * @since [产品/模块版本](可选)
  67. */
  68. public void display(){
  69. System.out.println("------------------");
  70. System.out.println("type: " + type);
  71. System.out.println("ShallowCloneFavorite.name: " + this.scf.getName());
  72. System.out.println("DepthCloneFavorite.name: " + dcf.getName());
  73. if(null!=dcfList && !dcfList.isEmpty()){
  74. for(int i=0; i<dcfList.size(); i++){
  75. System.out.println("DepthCloneFavoriteList["+ (i+1) +"].name: " + dcfList.get(i).getName());
  76. }
  77. }
  78. System.out.println("------------------");
  79. }
  80. }

测试类:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. /**
  5. * JAVA clone之深浅拷贝测试
  6. *
  7. * @author yzl
  8. */
  9. public class Test {
  10. public static void main(String[] args) throws Exception {
  11. Person p = getBasePerson();
  12. p.display();
  13.  
  14. Person p1 = p.clone();
  15. p1.setType("girl");
  16. p1.getDcf().setName("dancing");
  17. p1.getScf().setName("singing");
  18. p1.getDcfList().get(0).setName("yoga");
  19. p1.display();
  20.  
  21. p.display();
  22. }
  23.  
  24. private static Person getBasePerson(){
  25. ShallowCloneFavorite scf = new ShallowCloneFavorite();
  26. scf.setName("basketball");
  27.  
  28. DepthCloneFavorite dcf = new DepthCloneFavorite();
  29. dcf.setName("football");
  30.  
  31. DepthCloneFavorite dcf2 = new DepthCloneFavorite();
  32. dcf2.setName("baseball");
  33. List<DepthCloneFavorite> dcfList = new ArrayList<DepthCloneFavorite>(1);
  34. dcfList.add(dcf2);
  35.  
  36. Person p = new Person();
  37. p.setType("boy");
  38. p.setDcf(dcf);
  39. p.setDcfList(dcfList);
  40. p.setScf(scf);
  41.  
  42. return p;
  43. }
  44. }

运行结果如下:

  1. ------------------
  2. type: boy
  3. ShallowCloneFavorite.name: basketball(浅度拷贝,值变化了)
  4. DepthCloneFavorite.name: football
  5. DepthCloneFavoriteList[1].name: baseball
  6. ------------------
  7. ------------------
  8. type: girl
  9. ShallowCloneFavorite.name: singing
  10. DepthCloneFavorite.name: dancing
  11. DepthCloneFavoriteList[1].name: yoga
  12. ------------------
  13. ------------------
  14. type: boy
  15. ShallowCloneFavorite.name: singing(浅度拷贝,值变化了)
  16. DepthCloneFavorite.name: football
  17. DepthCloneFavoriteList[1].name: baseball
  18. ------------------

java Clone之深浅拷贝的更多相关文章

  1. Java中的深浅拷贝问题,你清楚吗?

    一.前言 拷贝这个词想必大家都很熟悉,在工作中经常需要拷贝一份文件作为副本.拷贝的好处也很明显,相较于新建来说,可以节省很大的工作量.在Java中,同样存在拷贝这个概念,拷贝的意义也是可以节省创建对象 ...

  2. 关于Java的Object.clone()方法与对象的深浅拷贝

    文章同步更新在个人博客:关于Java的Object.clone()方法与对象的深浅拷贝 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理.这时候就可以用到Java中的Object.clon ...

  3. java提高(15)---java深浅拷贝

    #java深浅拷贝 一.前言 为什么会有深浅拷贝这个概念? 我觉得主要跟JVM内存分配有关,对于基本数据类型,只存在栈内存,所以它的拷贝不存在深浅拷贝这个概念.而对于对象而言,一个对象的创建会在内存中 ...

  4. 关于Java中的HashMap的深浅拷贝的测试与几点思考

    0.前言 工作忙起来后,许久不看算法,竟然DFA敏感词算法都要看好一阵才能理解...真是和三阶魔方还原手法一样,田园将芜,非常可惜啊. 在DFA算法中,第一步是需要理解它的数据结构,在此基础上,涉及到 ...

  5. C++/C#中堆栈、对象内存模型、深浅拷贝、Array.Clone方法

    转载自:http://blog.csdn.net/jarvischu/article/details/6425534 目录 1.      C++/C#中对象内存模型................. ...

  6. 为什么阿里Java手册推荐慎用 Object 的 clone 方法来拷贝对象

    图片若无法显示,可至掘金查看https://juejin.im/post/5d425230f265da039519d248 前言 在阿里Java开发手册中,有这么一条建议:慎用 Object 的 cl ...

  7. 什么是java的深浅拷贝?

    什么是java的深浅拷贝? 浅拷贝 就是很肤浅的拷贝,只拷贝了别人的地址.没有拷贝地址里面的值.地址里面的值改变后,就都改变了. 深拷贝 就是很深入的拷贝,深入到核心的拷贝,拷贝了别人地址里面的值,别 ...

  8. 巨蟒python全栈开发-第7天 基本数据类型补充&深浅拷贝

    1.基本数据类型补充 2.深浅拷贝 DAY7-基本数据类型(基本数据类型补充&深浅拷贝) 本节主要内容: 1.补充基础数据类型 (1)join方法 (2)split方法 (3)列表不能在循环时 ...

  9. 【 js 基础 】 深浅拷贝

    underscore的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有传参,实际上只是为了返回数组的副本,例如 underscore 中 clone 的方法: ...

随机推荐

  1. android --- Afianl框架里面的FinalBitmap加载网络图片

    Afinal里面FinalBitmap:用于显示bitmap图片,而无需考虑线程并发和oom等问题. 1.测试请求 使用网页打开http://avatar.csdn.net/C/6/8/1_bz419 ...

  2. STL(1)

    这一篇因为游戏设计而写的,里面采用了STL,先借用一下,过段时间专项研究. 模板 模板就是一种通用化的类,同一种模板可以创建无数种具有共同特征的容器类型.首先需要指定基础类型,比如int ,char, ...

  3. MyEclipse 10 中如何更改字体

    打开Myeclipse软件.window->preferences->General->Appearance->Colors and Fonts然后在窗口的右边会显示一些如下图 ...

  4. mysql语句:批量更新多条记录的不同值[转]

    mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...

  5. ASP.NET Core 源码阅读笔记(5) ---Microsoft.AspNetCore.Routing路由

    这篇随笔讲讲路由功能,主要内容在项目Microsoft.AspNetCore.Routing中,可以在GitHub上找到,Routing项目地址. 路由功能是大家都很熟悉的功能,使用起来也十分简单,从 ...

  6. console.log 被重写覆盖以后如何恢复

    有时候一些项目中会使用类似如下的方式覆盖掉console对象: var console = {}; console.log = function(){}; console.info = functio ...

  7. mongodb(一) NoSQL简介

    NoSQL简介   写在前面,本文就是学习的记录笔记,大部分内容都属于参考,分享给大家 关系与非关系数据库      那么应该了解下影响关系数据库性能的主要原因: 在关系型数据库中,导致性能欠佳的最主 ...

  8. 使用ExceptionHandlingScope进行高效的SharePoint CSOM编程

    异常处理 在我们使用SharePoint API的时候,获取某些对象的时候,可能会出异常,那么CSOM如何处理这种情况呢. 我们在获取某个List的时候,代码如下: using (ClientCont ...

  9. Git常用操作命令与图解

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...

  10. 汇编语言hello world

    DOS下: ;栈段 stack segment stack db dup(?) stack ends ;数据段 data segment szHello db 'Hello,world',0dh,0a ...