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)根据另一个同类 ...
随机推荐
- (长期更新)OI常用模板
代码很简单的模板就不收录了. DFT 离散傅立叶变换 void dft(pdd *a,int l,bool r){ int i,j=l/2,k; for(i=1;i<l;++i){ if(i&l ...
- java入门---简介&简单输出小例子&开发前准备
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出.J ...
- 关于springboot 打包问题 jar包和 war包
起因:项目开发完成 需要打包部署了 发现自己不会打包 那么开始网上学习打包? 那么怎么来打包那? 我们以前没有采用springboot 时候我们都是直接将项目打成war包形式 然后放到tomc ...
- Django-modelfrom组件
ModelForm a. class Meta: model, # 对应Model的 fi ...
- 还原T4模板执行前的警告对话框
T4模板在保存的时候都会弹出个对话框,确认是否立即执行,大部分情况下我是不想立即执行的,所以一般都点Cancel,只有想执行的时候才点OK. 今天操作的时候不小心勾选了“Do not show thi ...
- webpack实践总结
一.Loader写法及执行顺序 从webpack2起,loader的格式如下: module: { rules: [ {test: /\.css$/, use: ['style-loader','cs ...
- Selenium搭配TestNG
用Maven来构建TestNG依赖: <dependency> <groupId>org.testng</groupId> <artifactId>te ...
- 阿里云ECS下基于Centos7.4安装MySQL5.7.20
1.首先登录阿里云ECS服务器,如下图所示: 2.卸载MariaDB 说明:CentOS7.x默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包.因为Maria ...
- 1098 Insertion or Heap Sort (25 分)(堆)
这里的第二序列相当于是排序还没拍好的序列 对于第二个样例的第二个序列其实已经是大顶堆了 然后才进行的堆排序 知道这个就好做了 #include<bits/stdc++.h> using n ...
- GraphSAGE 代码解析 - minibatch.py
class EdgeMinibatchIterator """ This minibatch iterator iterates over batches of samp ...