Java拷贝构造函数初尝试
浅复制(浅克隆) :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制(深克隆) :被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
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='男'} |
内存分析:

浅拷贝:
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='男'} |
内存分析:

Java拷贝构造函数初尝试的更多相关文章
- java拷贝构造函数
浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象. 深拷贝就是两个对象的值相等,但是互相独立. 构造函数的参数是该类的一个实例. Operator = 拷贝构造函数 ...
- C++中的构造函数,拷贝构造函数和赋值运算
关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...
- C++的转换构造函数、拷贝构造函数、赋值运算符重载
1 转换构造函数 C++的转换构造函数是只有一个参数的构造函数.当程序试图将一个其他类型的对象或基本类型值赋给该类的一个待初始化对象时(如Person p="Dean";) ...
- 如何避免被C++默认拷贝构造函数忽悠?
一.背景介绍 因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
- C++拷贝构造函数总结
C++拷贝构造函数总结 目录: 拷贝构造函数的基础知识 拷贝构造函数的使用 拷贝构造函数的行为 1.拷贝构造函数的基础知识 拷贝构造函数(copy constructor)是构造函数,是拷贝已经存在的 ...
- 深度解析C++拷贝构造函数
自2003年开始,断断续续用了12年C++,直到这两年做物联网嵌入式开发,感觉对C++的掌握仅有10%左右.习惯了C#开发,C++倒显得难以下手!今天就一个函数返回问题跟辉月兄弟讨论一番,大有所获,足 ...
- SQLSERVER2012里的扩展事件初尝试(下)
SQLSERVER2012里的扩展事件初尝试(下) SQLSERVER2012里的扩展事件初尝试(上) 我们继续文章扩展事件在Denali CTP3里的新UI(二)里的这个实验 脚本文件下载:http ...
- C++复制控制:拷贝构造函数
一.拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.与默认构造函数一样 ,拷贝构造函数可由编译器隐式调用.拷贝构造函数应用的场合为: (1)根据另一个同类 ...
随机推荐
- 8.Mongodb备份与恢复
1.备份 语法 mongodump -h dbhost -d dbname -o dbdirectory -h:服务器地址,也可以指定端口号 -d:需要备份的数据库名称 -o:备份的数据存放位置,此目 ...
- Coap协议学习笔记-第一篇
1. 物联网应用上一般使用单片机(或者其他SOC),单片机的RAM内存一般只有20KB~~128KB左右,然而一个TCP协议栈可能就20KB,所以只能用UDP,因为UDP相对小很多,然后在UDP上加了 ...
- mongodb 安装使用遇到的问题记录
mongodb 常用命令: https://www.mongodb.org/downloads 官网64位下载链接 https://fastdl.mongodb.org/linux/mongodb-l ...
- C++调用Asprise OCR识别图片
在一个识别软件中发现了Asprise OCR的"身影",上官网查了一下相关信息,发现功能挺强大的,识别印刷体应该不错,遗憾的是好像不能识别中文,不过不知道它对扭曲后的英文识别能力怎 ...
- 《python核心编程第二版》第1章练习
1–1. 安装 Python.请检查 Python 是否已经安装到你的系统上,如果没有,请下载并 安装它 略 1–2. 执行 Python.有多少种运行 Python 的不同方法?你喜欢哪一种?为什 ...
- MySQL☞between ... and ...
between 初值 and 终值:求出该列列值在初值和终值之间所有的数据 格式如下: select 列名/* from 表名 where 列名 between 初值 and 终值 如下图:
- 0.爬虫 urlib库讲解 urlopen()与Request()
# 注意一下 是import urllib.request 还是 form urllib import request 0. urlopen() 语法:urllib.request.urlopen(u ...
- 目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple- ...
- 链上链下交互 以太坊Dapp接口开发
主要是指的是用NodeJs调用 提供接口供前端使用 用户查询和转账 以太坊Dapp项目 众筹项目 功能需求 路人 查看所有众筹项目, 2 @ OK 根据众筹项目的address获取该众筹的详情 (参与 ...
- 项目启动报错: No naming context bound to this class loader
发步项目到本地tomcat,启动后,一直包错: 警告: Failed to retrieve JNDI naming context for container [StandardEngine[Ca ...