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

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

 package com.itinfo;

 /**
* 测试实体类
*
* @author Wáng Chéng Dá
* @create 2017-02-24 10:41
*/
public class PersonT { private String name; private int age; private String sex; public PersonT() {
} public PersonT(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
} public PersonT(PersonT personT) {
this.name = personT.name;
this.age = personT.age;
this.sex = personT.sex;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public String toString() {
return "PersonT{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}

深拷贝:

 package com.itinfo;

 /**
* 浅析浅拷贝和深拷贝
*
* @author Wáng Chéng Dá
* @create 2017-02-24 8:22
*/
public class Asian {
private String skin;
private PersonT person; public Asian() {
} public Asian(String skin, PersonT person) {
this.skin = skin;
this.person = person;
} public Asian(Asian asian) {
this.skin = asian.skin;
this.person = new PersonT(asian.person);
} // public Asian(Asian asian) {
// this(asian.skin, asian.person);
// } public String getSkin() {
return skin;
} public void setSkin(String skin) {
this.skin = skin;
} public PersonT getPerson() {
return person;
} public void setPerson(PersonT person) {
this.person = person;
} @Override
public String toString() {
return "Asian{" +
"skin='" + skin + '\'' +
", person=" + person.toString() +
'}';
} public static void main(String[] args) {
PersonT p1 = new PersonT("张三", 14, "男");
PersonT p2 = new PersonT(p1);
System.out.println(p1.toString());
System.out.println(p2.toString()); //修改p1
System.out.println("---------修改p1----------");
p1.setName("李四");
p1.setAge(19);
p1.setSex("女");
System.out.println(p1.toString());
System.out.println(p2.toString()); //修改p2
System.out.println("---------修改p2----------");
p2.setName("王二");
p2.setAge(23);
p2.setSex("男");
System.out.println(p1.toString());
System.out.println(p2.toString()); System.out.println("-------------------------");
Asian a1 = new Asian("yellow", p1);
Asian a2 = new Asian(a1);
System.out.println(a1.toString());
System.out.println(a2.toString()); //修改a1
System.out.println("---------修改a1----------");
a1.setSkin("back");
a1.getPerson().setName("麻子");
a1.getPerson().setAge(28);
a1.getPerson().setSex("男");
System.out.println(a1.toString());
System.out.println(a2.toString()); //修改a2
System.out.println("---------修改a2----------");
a2.setSkin("red");
a2.getPerson().setName("诗诗");
a2.getPerson().setAge(25);
a2.getPerson().setSex("女");
System.out.println(a1.toString());
System.out.println(a2.toString()); }
}

控制台输出:

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='女'}}

内存分析:

浅拷贝:

 package com.itinfo;

 /**
* 浅析浅拷贝和深拷贝
*
* @author Wáng Chéng Dá
* @create 2017-02-24 8:22
*/
public class Asian {
private String skin;
private PersonT person; public Asian() {
} public Asian(String skin, PersonT person) {
this.skin = skin;
this.person = person;
} // public Asian(Asian asian) {
// this.skin = asian.skin;
// this.person = new PersonT(asian.person);
// } public Asian(Asian asian) {
this(asian.skin, asian.person);
} public String getSkin() {
return skin;
} public void setSkin(String skin) {
this.skin = skin;
} public PersonT getPerson() {
return person;
} public void setPerson(PersonT person) {
this.person = person;
} @Override
public String toString() {
return "Asian{" +
"skin='" + skin + '\'' +
", person=" + person.toString() +
'}';
} public static void main(String[] args) {
PersonT p1 = new PersonT("张三", 14, "男");
PersonT p2 = new PersonT(p1);
System.out.println(p1.toString());
System.out.println(p2.toString()); //修改p1
System.out.println("---------修改p1----------");
p1.setName("李四");
p1.setAge(19);
p1.setSex("女");
System.out.println(p1.toString());
System.out.println(p2.toString()); //修改p2
System.out.println("---------修改p2----------");
p2.setName("王二");
p2.setAge(23);
p2.setSex("男");
System.out.println(p1.toString());
System.out.println(p2.toString()); System.out.println("-------------------------");
Asian a1 = new Asian("yellow", p1);
Asian a2 = new Asian(a1);
System.out.println(a1.toString());
System.out.println(a2.toString()); //修改a1
System.out.println("---------修改a1----------");
a1.setSkin("back");
a1.getPerson().setName("麻子");
a1.getPerson().setAge(28);
a1.getPerson().setSex("男");
System.out.println(a1.toString());
System.out.println(a2.toString()); //修改a2
System.out.println("---------修改a2----------");
a2.setSkin("red");
a2.getPerson().setName("诗诗");
a2.getPerson().setAge(25);
a2.getPerson().setSex("女");
System.out.println(a1.toString());
System.out.println(a2.toString()); }
}

控制台输出:

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. POLYGON(动态规划)

    学校老师布置的一道动规的题目,要求下次上课前AC.周一一放学就回家写,调试了一会儿OK了.在这边记录一下解题的思路和过程,也作为第一篇随笔,就是随便之一写,您也就随便之一看.有问题望你指出,多多包涵. ...

  2. 通过transpose和flip实现图像旋转90/180/270度

    在fbc_cv库中,提供了对图像进行任意角度旋转的函数rotate,其实内部也是调用了仿射变换函数warpAffine.如果图像仅是进行90度倍数的旋转,是没有必要用warpAffine函数的.这里通 ...

  3. Linux 下 PHP 扩展Soap 编译安装

    1.进入 PHP 的软件包 pdo 扩展目录中(注:不是 PHP 安装目录) [root@tester /]# /home/tdweb/php-5.4.34/ext/soap 执行 phpize 命令 ...

  4. ExtJs4.1目录结构介绍和使用说明[转]

    一.在做ExtJs开发之前首先要到网站上下载ExtJs的开发包,我用的最新版本是4.1.1.此版本相对于之前的版本目录结构发生了一些变化,没有了adapter目录, 目录结构如下 文件/文件夹名的作用 ...

  5. Python 3基础教程27-字典

    这篇来介绍Python中的字典.字典一般用大括号包裹起来,里面的元素都是有键和值组成. # 字典 # 我们随便设计几个城市的明天的最高温度tem ={'北京':22,'上海':23,'深圳':24,' ...

  6. JMeter上传图片

    JMeter怎样上传图片? 请注意图片的路径要与.jmx脚本的目录保持一致, 或者放在JMeter的bin目录下. 协议:http 服务器名称或IP:www.abcdef.com 方法:POST 路径 ...

  7. Laxcus大数据管理系统2.0(3)- 第一章 基础概述 1.2 产品特点

    1.2 产品特点 Laxcus大数据管理系统运行在计算机集群上,特别强调软件对分布资源可随机增减的适应性.这种运行过程中数据动态波动和需要瞬时感知的特点,完全不同与传统的集中处理模式.这个特性衍生出一 ...

  8. su: Authentication failure

    su: Authentication failure问题解决: su 命令切换失败,提示su: Authentication failure,只要你sudo passwd root过一次之后,下次再s ...

  9. 关键词提取TF-IDF算法/关键字提取之TF-IDF算法

    TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与信息探勘的常用加权技术.TF的意思是词频(Term - frequency),  ...

  10. LeetCode 206——反转链表

    对单链表进行反转有迭代法和递归法两种. 1. 迭代法 迭代法从前往后遍历链表,定义三个指针分别指向相邻的三个结点,反转前两个结点,即让第二个结点指向第一个结点.然后依次往后移动指针,直到第二个结点为空 ...