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

深复制(深克隆) :被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

  1. package com.itinfo;
  2.  
  3. /**
  4. * 测试实体类
  5. *
  6. * @author Wáng Chéng Dá
  7. * @create 2017-02-24 10:41
  8. */
  9. public class PersonT {
  10.  
  11. private String name;
  12.  
  13. private int age;
  14.  
  15. private String sex;
  16.  
  17. public PersonT() {
  18. }
  19.  
  20. public PersonT(String name, int age, String sex) {
  21. this.name = name;
  22. this.age = age;
  23. this.sex = sex;
  24. }
  25.  
  26. public PersonT(PersonT personT) {
  27. this.name = personT.name;
  28. this.age = personT.age;
  29. this.sex = personT.sex;
  30. }
  31.  
  32. public String getName() {
  33. return name;
  34. }
  35.  
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39.  
  40. public int getAge() {
  41. return age;
  42. }
  43.  
  44. public void setAge(int age) {
  45. this.age = age;
  46. }
  47.  
  48. public String getSex() {
  49. return sex;
  50. }
  51.  
  52. public void setSex(String sex) {
  53. this.sex = sex;
  54. }
  55.  
  56. @Override
  57. public String toString() {
  58. return "PersonT{" +
  59. "name='" + name + '\'' +
  60. ", age=" + age +
  61. ", sex='" + sex + '\'' +
  62. '}';
  63. }
  64. }

深拷贝:

  1. package com.itinfo;
  2.  
  3. /**
  4. * 浅析浅拷贝和深拷贝
  5. *
  6. * @author Wáng Chéng Dá
  7. * @create 2017-02-24 8:22
  8. */
  9. public class Asian {
  10. private String skin;
  11. private PersonT person;
  12.  
  13. public Asian() {
  14. }
  15.  
  16. public Asian(String skin, PersonT person) {
  17. this.skin = skin;
  18. this.person = person;
  19. }
  20.  
  21. public Asian(Asian asian) {
  22. this.skin = asian.skin;
  23. this.person = new PersonT(asian.person);
  24. }
  25.  
  26. // public Asian(Asian asian) {
  27. // this(asian.skin, asian.person);
  28. // }
  29.  
  30. public String getSkin() {
  31. return skin;
  32. }
  33.  
  34. public void setSkin(String skin) {
  35. this.skin = skin;
  36. }
  37.  
  38. public PersonT getPerson() {
  39. return person;
  40. }
  41.  
  42. public void setPerson(PersonT person) {
  43. this.person = person;
  44. }
  45.  
  46. @Override
  47. public String toString() {
  48. return "Asian{" +
  49. "skin='" + skin + '\'' +
  50. ", person=" + person.toString() +
  51. '}';
  52. }
  53.  
  54. public static void main(String[] args) {
  55. PersonT p1 = new PersonT("张三", 14, "男");
  56. PersonT p2 = new PersonT(p1);
  57. System.out.println(p1.toString());
  58. System.out.println(p2.toString());
  59.  
  60. //修改p1
  61. System.out.println("---------修改p1----------");
  62. p1.setName("李四");
  63. p1.setAge(19);
  64. p1.setSex("女");
  65. System.out.println(p1.toString());
  66. System.out.println(p2.toString());
  67.  
  68. //修改p2
  69. System.out.println("---------修改p2----------");
  70. p2.setName("王二");
  71. p2.setAge(23);
  72. p2.setSex("男");
  73. System.out.println(p1.toString());
  74. System.out.println(p2.toString());
  75.  
  76. System.out.println("-------------------------");
  77. Asian a1 = new Asian("yellow", p1);
  78. Asian a2 = new Asian(a1);
  79. System.out.println(a1.toString());
  80. System.out.println(a2.toString());
  81.  
  82. //修改a1
  83. System.out.println("---------修改a1----------");
  84. a1.setSkin("back");
  85. a1.getPerson().setName("麻子");
  86. a1.getPerson().setAge(28);
  87. a1.getPerson().setSex("男");
  88. System.out.println(a1.toString());
  89. System.out.println(a2.toString());
  90.  
  91. //修改a2
  92. System.out.println("---------修改a2----------");
  93. a2.setSkin("red");
  94. a2.getPerson().setName("诗诗");
  95. a2.getPerson().setAge(25);
  96. a2.getPerson().setSex("女");
  97. System.out.println(a1.toString());
  98. System.out.println(a2.toString());
  99.  
  100. }
  101. }

控制台输出:

PersonT{name='张三', age=14, sex='男'}
PersonT{name='张三', age=14, sex='男'}
---------修改p1----------
PersonT{name='李四', age=19, sex='女'}
PersonT{name='张三', age=14, sex='男'}
---------修改p2----------
PersonT{name='李四', age=19, sex='女'}
PersonT{name='王二', age=23, sex='男'}
-------------------------
Asian{skin='yellow', person=PersonT{name='李四', age=19, sex='女'}}
Asian{skin='yellow', person=PersonT{name='李四', age=19, sex='女'}}
---------修改a1----------
Asian{skin='back', person=PersonT{name='麻子', age=28, sex='男'}}
Asian{skin='yellow', person=PersonT{name='李四', age=19, sex='女'}}
---------修改a2----------
Asian{skin='back', person=PersonT{name='麻子', age=28, sex='男'}}
Asian{skin='red', person=PersonT{name='诗诗', age=25, sex='女'}}

内存分析:

浅拷贝:

  1. package com.itinfo;
  2.  
  3. /**
  4. * 浅析浅拷贝和深拷贝
  5. *
  6. * @author Wáng Chéng Dá
  7. * @create 2017-02-24 8:22
  8. */
  9. public class Asian {
  10. private String skin;
  11. private PersonT person;
  12.  
  13. public Asian() {
  14. }
  15.  
  16. public Asian(String skin, PersonT person) {
  17. this.skin = skin;
  18. this.person = person;
  19. }
  20.  
  21. // public Asian(Asian asian) {
  22. // this.skin = asian.skin;
  23. // this.person = new PersonT(asian.person);
  24. // }
  25.  
  26. public Asian(Asian asian) {
  27. this(asian.skin, asian.person);
  28. }
  29.  
  30. public String getSkin() {
  31. return skin;
  32. }
  33.  
  34. public void setSkin(String skin) {
  35. this.skin = skin;
  36. }
  37.  
  38. public PersonT getPerson() {
  39. return person;
  40. }
  41.  
  42. public void setPerson(PersonT person) {
  43. this.person = person;
  44. }
  45.  
  46. @Override
  47. public String toString() {
  48. return "Asian{" +
  49. "skin='" + skin + '\'' +
  50. ", person=" + person.toString() +
  51. '}';
  52. }
  53.  
  54. public static void main(String[] args) {
  55. PersonT p1 = new PersonT("张三", 14, "男");
  56. PersonT p2 = new PersonT(p1);
  57. System.out.println(p1.toString());
  58. System.out.println(p2.toString());
  59.  
  60. //修改p1
  61. System.out.println("---------修改p1----------");
  62. p1.setName("李四");
  63. p1.setAge(19);
  64. p1.setSex("女");
  65. System.out.println(p1.toString());
  66. System.out.println(p2.toString());
  67.  
  68. //修改p2
  69. System.out.println("---------修改p2----------");
  70. p2.setName("王二");
  71. p2.setAge(23);
  72. p2.setSex("男");
  73. System.out.println(p1.toString());
  74. System.out.println(p2.toString());
  75.  
  76. System.out.println("-------------------------");
  77. Asian a1 = new Asian("yellow", p1);
  78. Asian a2 = new Asian(a1);
  79. System.out.println(a1.toString());
  80. System.out.println(a2.toString());
  81.  
  82. //修改a1
  83. System.out.println("---------修改a1----------");
  84. a1.setSkin("back");
  85. a1.getPerson().setName("麻子");
  86. a1.getPerson().setAge(28);
  87. a1.getPerson().setSex("男");
  88. System.out.println(a1.toString());
  89. System.out.println(a2.toString());
  90.  
  91. //修改a2
  92. System.out.println("---------修改a2----------");
  93. a2.setSkin("red");
  94. a2.getPerson().setName("诗诗");
  95. a2.getPerson().setAge(25);
  96. a2.getPerson().setSex("女");
  97. System.out.println(a1.toString());
  98. System.out.println(a2.toString());
  99.  
  100. }
  101. }

控制台输出:

PersonT{name='张三', age=14, sex='男'}
PersonT{name='张三', age=14, sex='男'}
---------修改p1----------
PersonT{name='李四', age=19, sex='女'}
PersonT{name='张三', age=14, sex='男'}
---------修改p2----------
PersonT{name='李四', age=19, sex='女'}
PersonT{name='王二', age=23, sex='男'}
-------------------------
Asian{skin='yellow', person=PersonT{name='李四', age=19, sex='女'}}
Asian{skin='yellow', person=PersonT{name='李四', age=19, sex='女'}}
---------修改a1----------
Asian{skin='back', person=PersonT{name='麻子', age=28, sex='男'}}
Asian{skin='yellow', person=PersonT{name='麻子', age=28, sex='男'}}
---------修改a2----------
Asian{skin='back', person=PersonT{name='诗诗', age=25, sex='女'}}
Asian{skin='red', person=PersonT{name='诗诗', age=25, sex='女'}}

内存分析:

Java拷贝构造函数初尝试的更多相关文章

  1. java拷贝构造函数

    浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象. 深拷贝就是两个对象的值相等,但是互相独立. 构造函数的参数是该类的一个实例.   Operator = 拷贝构造函数 ...

  2. C++中的构造函数,拷贝构造函数和赋值运算

    关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...

  3. C++的转换构造函数、拷贝构造函数、赋值运算符重载

    1 转换构造函数     C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...

  4. 如何避免被C++默认拷贝构造函数忽悠?

    一.背景介绍           因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...

  5. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

  6. C++拷贝构造函数总结

    C++拷贝构造函数总结 目录: 拷贝构造函数的基础知识 拷贝构造函数的使用 拷贝构造函数的行为 1.拷贝构造函数的基础知识 拷贝构造函数(copy constructor)是构造函数,是拷贝已经存在的 ...

  7. 深度解析C++拷贝构造函数

    自2003年开始,断断续续用了12年C++,直到这两年做物联网嵌入式开发,感觉对C++的掌握仅有10%左右.习惯了C#开发,C++倒显得难以下手!今天就一个函数返回问题跟辉月兄弟讨论一番,大有所获,足 ...

  8. SQLSERVER2012里的扩展事件初尝试(下)

    SQLSERVER2012里的扩展事件初尝试(下) SQLSERVER2012里的扩展事件初尝试(上) 我们继续文章扩展事件在Denali CTP3里的新UI(二)里的这个实验 脚本文件下载:http ...

  9. C++复制控制:拷贝构造函数

    一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...

随机推荐

  1. Entity Framework + WCF 远程调用出错

            在使用Entity Framework中使用WCF,在程序中调用服务一直报错,我一直以为是WCF的哪个地方的配置有问题,找来找去,一直没有解决.         最后在网上找到一篇文章 ...

  2. Qt 个性化标题栏,自定义标题栏

    目前还没有达到自己满意的地步,魔方别人写的的,先提供参考,后面在加入新的东西 头文件 #ifndef TITLEBAR_H #define TITLEBAR_H #include <QWidge ...

  3. 杀死 tomcat 进程的脚本

    新建一个.sh 文件 把下面的内容复制进去.然后 把这个文件放到tomcat 的bin目录下在关闭tomcat 执行这个脚本. 可以解决 在关闭tomcat的时候 总是遗留一些tomcat进程没有结束 ...

  4. 第二十一篇 json,picklz,xml模块

    Json模块 Json模块比较简单,仅有四个方法dumps()和loads()方法,dump()和load()方法,但是却非常的常用,实用性极强. 如果要在不同的编程语言之间传递对象,就必须把对象序列 ...

  5. 7.0 启动app权限弹窗问题

    这里提供两种解决方案! 1.安卓6.0+是可以直接利用uiautomator定位元素点击!这个不细说,定位方式很多种...这个等待时间大家自己定大概两到三秒即可! #安卓6.0+点击方式driver. ...

  6. 在Code::Blocks中编译和使用wxWidgets3.0.0教程

      跳转至:指南,搜索 注意,编译Code :: Blocks的对wxWidgets的3.0.0链接不是很稳定,但该库至少可以被正确编译,(只是使用的时候可能会有问题):CodeBlocks开发商都在 ...

  7. 时间动态协同过滤(TimeSVD++)

    原作者 原论文地址 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.379.1951&rep=rep1&type=pd ...

  8. cocos2d-x 显示中文字符和解析XML文件 转载

    源地址:http://codingnow.cn/cocos2d-x/1038.html 在cocos2d-x中直接显示中文的时候会出现乱码,虽然在实际开发中把字符串直接写在代码里也不是好的做法,但是有 ...

  9. 利用java中的BigInteger实现进制转换

    [原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: package com.jiajia.demo_1; im ...

  10. java对数组的操作

    1 拷贝数组 数组全拷贝 数组定位拷贝 2 判断数组是否相等(每个元素都对应相等) 3 数组和集合的相互转化 import java.util.Arrays; import java.util.Lis ...