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 ...
随机推荐
- 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)
先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...
- robotframework编写用例
** Test Cases *** Test With Settings [Documentation] Another dummy test # 用于指定测试用例文档 [Tags] dummy ow ...
- 【BZOJ1999】【NOIP2007】树网的核 单调队列优化DP
题目描述 题目很长,大家自己去看吧. bzoj vijos 原题\(n\leq 300\) 加强版\(n\leq 500000\) 题解 这种东西当然要猜结论的啦,否则会比较麻烦. 结论1:如果有很多 ...
- MT【284】构造函数的导数的两类题型
第一类: 已知定义在$R$上的奇函数$f(x),f(-1)=0,$当$x>0$时,$xf^{'}(x)-f(x)<0,$则$f(x)>0$的解集为____ 第二类: 已知函数$f(x ...
- 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)
Description 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...
- 【BZOJ3252】攻略(长链剖分,贪心)
[BZOJ3252]攻略(长链剖分,贪心) 题面 BZOJ 给定一棵树,每个点有点权,选定\(k\)个叶子,满足根到\(k\)个叶子的所有路径所覆盖的点权和最大. 题解 一个假装是对的贪心: 每次选择 ...
- 【bfs】Knight Moves
[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ...
- 「JLOI2015」战争调度 解题报告
「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...
- 借助baidu的jsonp接口,做一个自己的候选词组件
先观察 对接口进行提炼:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词&cb=回调函数 简单测试一下: <!DOC ...
- window无法启动mongodb服务:系统找不到指定的文件错误的解决方法
原文:http://www.phperz.com/article/15/0530/131534.html 错误描述 错误2:系统找不到指定文件 思考过程 昨天做测试的时候,先后安装了两次MongoDB ...