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 ...
随机推荐
- wstngfw中使用Viscosity连接OpenV-P-N服务器
wstngfw中使用Viscosity连接OpenV-P-N服务器 在本例中,将假设以下设置: 站点 A 站点 B 名称 Beijing Office(北京办公室) 名称 Shenzheng Offi ...
- JLOI2015 DAY1 简要题解
「JLOI2015」有意义的字符串 题意 给你 \(b, d, n\) 求 \[ [(\frac{b + \sqrt d}2)^n] \mod 7528443412579576937 \] \(0 & ...
- 如何在代码中减少if else语句的使用
前言 代码中嵌套的if/else结构往往导致代码不美观,也不易于理解.面向过程的开发中代码有大量的if else,在java中可以用一些设计模式替换掉这些逻辑,那么在js中是否也有类似的方法用来尽可能 ...
- 【dfs】p1025 数的划分
P1025 数的划分 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有 ...
- ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)
题目链接 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性 ...
- ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存
ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate : Hibernate是一个持久层框架,经常访问物理数据库 ...
- css 圆形头像
方法一:背景图片(推荐) 好处是,图片长宽不等的情况下图片不会变形 .ui-photo { width: 100px; height: 100px; background: url("img ...
- JavaScript ES6 核心功能一览
JavaScript 在过去几年里发生了很大的变化.这里介绍 12 个你马上就能用的新功能. JavaScript 历史 新的语言规范被称作 ECMAScript 6.也称为 ES6 或 ES2015 ...
- 自制模态窗体闪烁效果: MessageBeep & FlashWindowEx
SetFocus(hwnd_frame_preview); //设置焦点 /** 模拟模态窗口动作 **/ MessageBeep(0xFFFFFFFF); //0xFFFFFFFF SystemDe ...
- rewind()函数
函数名: rewind功 能: 将文件指针重新指向一个流的开头用 法: int rewind(FILE *stream);程序例: #include <stdio.h>#include & ...