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

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

 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. java入门---windows和Linux,UNIX,Solaris,FreeBSD下开发环境配置

        首先来看Windows下的操作.我们需要下载java开发工具包JDK.下载地址:http://www.oracle.com/technetwork/java/javase/downloads/ ...

  2. Hadoop学习(四) FileSystem Shell命令详解

    FileSystem Shell中大多数命令都和unix命令相同,只是两者之间的解释不同,如果你对unix命令有基本的了解,那么对于FileSystem Shell的命令,你将会感到很亲切. appe ...

  3. Git 查看远程分支、本地分支、删除本地分支及远程分支

    1. 删除本地分支: git branch -d branchName 2. 删除远程分支: // 方法一:将删除的本地分支推到远程(要删除的远程分支在本地有映射) git push origin : ...

  4. Spring 整合 Shiro

    一.引入依赖 <!-- spring start --> <dependency> <groupId>org.springframework</groupId ...

  5. Qt QML之不显示标题栏、边框

    原文连接:http://blog.csdn.net/u010780613 我使用的Qt版本是Qt 5.3.0,Qt Creator 是3.1.1. QML做界面实在太方便了,动画效果很不错. 创建一个 ...

  6. Linux-Shell脚本编程-学习-4-Shell编程-操作数字-加减乘除计算

    对于任何一种编程语言都很重要的特性就是操作数字的能力,遗憾的是,对于shell脚本来说,这个过程比较麻烦,在shell脚本中有两种途径来进行数学运算操作. 1.expr 最开始的时候,shell提供了 ...

  7. Qt 解析网络数据出现ssl错误

    最近写了点小东西,哈哈, 网络部分是同学帮我搞的 在编译的时候,出现了一下错误 qt.network.ssl: QSslSocket: cannot call unresolved function ...

  8. const在c/c++中的区别

    #include <iostream> using namespace std; int main() { ; ; }; ; i < sizeof array / sizeof *a ...

  9. pta编程(1-8)

    知识点:本次编程运用到的格式 #include<stdio.h> int main(void) { printf(); return 0; } 过程:1-3.没什么问题,就是注意字符的输入 ...

  10. ubuntu16.04 装了一天的gitlab

    1.安装gitlab baidu安装完了[后续再自己写安装过程] 2.遇到的问题 访问gitlab http://ip 可以进入页面也能操作但是console报404无法加载js和css,这样很不方便 ...