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)根据另一个同类 ...
随机推荐
- shell重温---基础篇(参数传递&echo命令)
经过前两天的学习,关于shell的基础算是知道的一般般啦,最起码不算是小白了(纯属意淫).今天就来点干货哈. 首先是运行shell脚本时的参数传递.脚本内获取参数的格式为$n.n代表了一个数字,例 ...
- 【娱乐向】制作Chrome天气预报扩展程序
1.什么是Chrome扩展程序 Chrome扩展程序是一个用Web技术开发,用来扩展增强浏览器功能的软件.和一般的网页一样,Chrome扩展程序由html.js.css和图片等部分组成.Chrome插 ...
- MVC中路由的修改和浏览器的地址参数
在 ASP.NET MVC 应用程序中,它是更常见的做法在作为路由数据 (像我们一样与身份证上面) 比将它们作为查询字符串传递的参数中传递. ) { return HttpUtility.HtmlEn ...
- 521. [NOIP2010] 引水入城 cogs
521. [NOIP2010] 引水入城 ★★★ 输入文件:flow.in 输出文件:flow.out 简单对比时间限制:1 s 内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...
- Spotlight on MySQL
聚光灯在MySQL 1.Sessios会话Total Users:总用户数前连接到MySQL服务器的用户会话总数Active Users:活跃用户此控件表示连接到当前正在执行SQL语句或其他数据库请求 ...
- 类和实例属性的查找顺序 mro查找
如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...
- Python简要标准库(5)
hashlib Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 基本的生成MD密匙的函数 import hashlib md5 = hashlib.md5() md5.up ...
- CPU拓扑结构
本篇旨在认识一下以下三种CPU拓扑结构分别是什么: Symmetric multiprocessing (SMP) Non-uniform memory access (NUMA) Simultane ...
- 创建vpc网络
vpc相关功能点: 模块 功能点 描述 备注 VPC 创建vpc网络 创建vpc网络,指定vpc网络名称 修改vpc网络 修改vpc网络名称 删除vpc网络 删除vpc网络 vpc相关命令 ...
- ardupilot_gazebo仿真(三)
ardupilot_gazebo仿真(三) 标签(空格分隔): 未分类 创建ROS node 实现对无人机的控制(软件在环) MAVROS MAVROS是ROS中的一个能够连接支持MAVLink地面站 ...