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)【原】的更多相关文章

  1. 浅copy 与 深copy

    import copy names = ["zhangyang", 'guyun', 'xiangpeng', ['jack','tom'], 'xuliangchen'] nam ...

  2. (五)聊一聊深Copy与浅Copy

    一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可 ...

  3. Python学习-赋值、浅copy和深copy

    Python Copy: 在Python语言中,分为浅拷贝和深拷贝两种形式,也就是官方文档中的Shadow copy和Deep copy.在对简单的对象(object)进行复制时,两者没有区别,如下面 ...

  4. Python的深copy和浅copy

    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 浅copy: a = [1, 2, ...

  5. 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 ...

  6. 【ObjectC—浅copy和深copy】

    一.OC设计copy的目的 为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象. 二.实现copy协议 OC提供了两种copy方法:copy和mutableCop ...

  7. 浅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 ...

  8. python浅copy和深copy

    import   copy person =["name",[count,3000]] husband=copy.copy(person) wife=copy.copy(perso ...

  9. Java的clone():深复制与浅复制

    Java中要想自定义类的对象可以被复制,自定义类就必须实现Cloneable中的clone()方法,如下: public class Student implements Cloneable { pr ...

随机推荐

  1. 图片文字识别aip的一个小Demo

    目前接触到了一个新的内容,识别图片上的文字,以下是这个Demo 首先需要在需要在百度云-管理中心创建应用 地址:http://console.bce.baidu.com/ai/#/ai/ocr/app ...

  2. Easy Finding POJ - 3740 (DLX)

    显然这是一道dfs简单题 或许匹配也能做 然而用了dancing links 显然这也是一道模板题 好的吧 调了一上午 终于弄好了模板 Easy Finding Time Limit: 1000MS ...

  3. quartus prime 16.0 报警告 inferring latch

    前言 当写always组合逻辑块时,可能会写出 poor code.综合时软件会推断出锁存器.例如下面代码: always @* begin 'b1) begin w = (a & b) ^ ...

  4. npm config 删除变量

    问题 安装npm时,使用npm config set 命令重新设置了变量,但是设置变量时少了个空格,设置错了.使用npm config ls -l 查看环境变量 添加错的这一个,应该如何删除? 解决 ...

  5. DNSCrypt

    DNSCrypt 来源 https://www.cnblogs.com/qiudabai/articles/9219840.html https://www.opendns.com/about/inn ...

  6. 网络流相关知识点以及题目//POJ1273 POJ 3436 POJ2112 POJ 1149

    首先来认识一下网络流中最大流的问题 给定一个有向图G=(V,E),把图中的边看做成管道,边权看做成每根管道能通过的最大流量(容量),给定源点s和汇点t,在源点有一个水源,在汇点有一个蓄水池,问s-t的 ...

  7. MT【262】一道常见错题

    若$f(x^2)$的定义域为$[-1,1]$,则函数$f(x)$的定义域为______ 设$a>0$构造$f(x)=\sqrt{x(1-x)(a+x)}$,此时$f(x^2)$的定义域为$[-1 ...

  8. ACM中的fread读入

    fread可以加快读入速度,尤其是读特大的二进制文件. #include <cctype> typedef long long LL; char buf[100000],*p1=buf,* ...

  9. 【Luogu4707】重返现世(min-max容斥)

    [Luogu4707]重返现世(min-max容斥) 题面 洛谷 求全集的\(k-max\)的期望 题解 \(min-max\)容斥的证明不难,只需要把所有元素排序之后考虑组合数的贡献,容斥系数先设出 ...

  10. 转----ui输入测试数据

    jin'tHackChecker黑测工作室 - 专注于软件安全测试技术研究!(www.AutomationQA.com)常用安全测试用例 建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL ...