java深copy (伪深copy)【原】
Teacher.java
package test.clone; /**
* 老师
* 深copy需要实现Cloneable接口
* @author King
*
*/
public class Teacher implements Cloneable { private String name; private int age; 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;
} @Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
} public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Student.java
package test.clone; /**
* 学生
* 浅copy需要实现Cloneable接口
* @author King
*
*/
public class Student implements Cloneable { private String name; private int age; private Teacher teacher; 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 Teacher getTeacher() {
return teacher;
} public void setTeacher(Teacher teacher) {
this.teacher = teacher;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", Teacher=" + teacher + "]";
} //浅copy
public Object clone() throws CloneNotSupportedException {
return super.clone();
} /**
* 浅copy (同clone()方法)
* 浅copy只对基本类型和String类型做全新复制,
* 属性对象引用是不会全新复制的,最终新copy出来的属性对象引用的还是同一个堆内存区域,比如teacher属性
* @return
* @throws CloneNotSupportedException
* ......
* @time 2018年1月26日 下午8:07:11
* @author King
*/
public Object shallowClone() throws CloneNotSupportedException {
return super.clone();
} /**
* 伪深copy
* 这种伪深copy模式,其实还是使用了浅copy技术,只是把属性对象再次赋了新的浅copy.
* 当对象比较简单时可以用这种模式,因为它比序列化深copy要来得快,还是定制化copy哪些属性
* @return
* @throws CloneNotSupportedException
* ......
* @time 2018年1月26日 下午8:09:39
* @author King
*/
public Object deepClone() throws CloneNotSupportedException {
Student stu = (Student) super.clone();
Teacher t2 = (Teacher) teacher.clone();
stu.setTeacher(t2);
return stu;
} }
FakeDeepCopy.java
伪深copy调用样例
package test.clone; /**
* fakeDeepCopy,其实是一种伪深copy,对象对比简单时可以使用这种技术
*
* @author King
*
*/
public class FakeDeepCopy { public static void main(String[] args) {
Teacher techarAAA = new Teacher();
techarAAA.setName("Teacher AAA");
techarAAA.setAge(30); Student studentAAA = new Student();
studentAAA.setName(new String("Student AAA"));
studentAAA.setAge(15);
studentAAA.setTeacher(techarAAA); System.out.println("学生复制前studentAAA:" + studentAAA);
try {
Student studentCopy = (Student) studentAAA.clone();
Teacher teacherCopy = studentCopy.getTeacher();
studentCopy.setName(new String("Student BBB"));
studentCopy.setAge(20);
teacherCopy.setName("Teacher BBB");
teacherCopy.setAge(45);
studentCopy.setTeacher(teacherCopy);
System.out.println("学生复制后studentAAA:" + studentAAA);
System.out.println("学生复制后studentCopy:" + studentCopy);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} } }
以上深copy主要通过各层浅copy实现.
真正完整深copy可通过序列化的方式.
java深copy (伪深copy)【原】的更多相关文章
- 浅copy 与 深copy
import copy names = ["zhangyang", 'guyun', 'xiangpeng', ['jack','tom'], 'xuliangchen'] nam ...
- (五)聊一聊深Copy与浅Copy
一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可 ...
- Python学习-赋值、浅copy和深copy
Python Copy: 在Python语言中,分为浅拷贝和深拷贝两种形式,也就是官方文档中的Shadow copy和Deep copy.在对简单的对象(object)进行复制时,两者没有区别,如下面 ...
- Python的深copy和浅copy
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 浅copy: a = [1, 2, ...
- Day 7 深copy和浅Copy
dict.fromkeys的用法 1 2 3 4 5 6 7 8 9 10 11 #dict.fromkeys的用法 #例子1 dic = dict.fromkeys([1,2,3],[]) prin ...
- 【ObjectC—浅copy和深copy】
一.OC设计copy的目的 为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象. 二.实现copy协议 OC提供了两种copy方法:copy和mutableCop ...
- 浅copy与深copy举例
例1: #!/usr/bin/env python import copy d1 = {'x':1,'y':2,'z':[3,4.5]} d2 = d1 d3 = d1.copy() d4 = co ...
- python浅copy和深copy
import copy person =["name",[count,3000]] husband=copy.copy(person) wife=copy.copy(perso ...
- Java的clone():深复制与浅复制
Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法,如下: public class Student implements Cloneable { pr ...
随机推荐
- [ZJOI2007] 仓库建设
传送门:>HERE< 题意:有n个地点,每个地点有货物P[i]个,距离起点(地点0)的距离为x[i].在每个地点建立仓库需要费用c[i],现在需要在某些地点建设仓库,从而将货物转移到仓库里 ...
- Matplotlib学习---用matplotlib和sklearn画拟合线(line of best fit)
在机器学习中,经常要用scikit-learn里面的线性回归模型来对数据进行拟合,进而找到数据的规律,从而达到预测的目的.用图像展示数据及其拟合线可以非常直观地看出拟合线与数据的匹配程度,同时也可用于 ...
- robotframework编写用例
** Test Cases *** Test With Settings [Documentation] Another dummy test # 用于指定测试用例文档 [Tags] dummy ow ...
- 基于FPGA的16阶级联型iir带通滤波器实现
警告 此文章将耗费你成吨的流量,请wifi下阅读,造成的流量浪费本人不承担任何责任.初版源代码获取(请勿用作他用,仅供学习):https://gitee.com/kingstacker/iir.git ...
- MT【296】必要性探路
已知$a,b\in R.f(x)=e^x-ax+b$,若$f(x)\ge1$恒成立,则$\dfrac{b-a}{a}$的取值范围_____ 提示:答案:$[-1,\infty)$取$x=0,b\ge0 ...
- MT【274】一道漂亮的不等式题
已知$x_1^2+x_2^2+\cdots+x_6^2=6,x_1+x_2+\cdots+x_6=0,$证明:$x_1x_2\cdots x_6\le\dfrac{1}{2}$ 解答:显然只需考虑2个 ...
- 【BZOJ3653】谈笑风生(长链剖分)
[BZOJ3653]谈笑风生(长链剖分) 题面 BZOJ 洛谷 权限题啊.... 题解 首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲. 所以这三个点是树上的一条深度单增的链. 因为\ ...
- ubuntu下查看磁盘读写情况
iostat -d -k 1 10 每秒刷新一次,共10次. 未完待续..
- bzoj3514(LCT+主席树)
题目描述 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解 对于一个截止时间来说,越晚的变越好. 所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维 ...
- [HEOI2014]逻辑翻译(分治)
题目描述 在人类的神经系统中,每个信号都可以用?1或+1来表示.这些信号组合起来最后形成 了喜怒哀乐,酸甜苦辣,红黄绿蓝等各种各样的复杂信息.纳米探测科技的突破让生物学家 可以测量大脑中特定区域的完整 ...