论clone深层复制和浅层复制
来源:互联网 发布:php 业务逻辑层 编辑:程序博客网 时间:2024/05/15 23:54
clone深层复制和浅层复制
开心一笑
什么是制度?
二嫂为了改二哥晚回家的习惯,跟二哥订了个制度,晚上11点不回家就锁门!第一周很奏效,第二周二哥毛病又犯了,二嫂果断执行制度,把门锁了。结果二哥干脆不回家了。
二嫂很郁闷,难道制度订错了吗? 后来经过党的群众路线教育实践活动督导组指点,修改制度:晚11点不回家,我就开着家门睡觉!谁想来就来。二哥大惊,从此11点之前准时回家。
自我介绍
浅层复制与深层复制概念:
浅层复制: 浅层复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深层复制:深层复制要复制的对象引用的对象都复制一遍。
我的特长
/** * Created by Ay on 2016/2/25. */public class Person implements Cloneable{ private int id; private String name; public Person(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } @Override protected Object clone(){ Object o = null; try { o = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { Person person = new Person(1,"小毅"); Person person2 = (Person)person.clone(); person2.setId(2); person2.setName("小兰"); System.out.println(person.getId() + " " + person.getName());//1 小毅 System.out.println(person2.getId() + " " + person2.getName());//2小兰 }}
上面只是一个简单的clone浅复制,并且不带引用……
下面是图片:
“`
下面看一个带有引用的浅复制
/** * Created by Ay on 2016/3/16. */public class ShallowClone implements Cloneable{ private int id; private String name; //存在引用person类 private Person person; public ShallowClone(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public static void main(String[] args) throws Exception{ ShallowClone shallowClone = new ShallowClone(1,"Ay"); shallowClone.setPerson(new Person(1,"Al")); //复制 ShallowClone clone = (ShallowClone)shallowClone.clone(); //打印信息 System.out.println(clone.getId() + " " + clone.getName());//result:1 Ay System.out.println(clone.getPerson().getId() + " " + clone.getPerson().getName());//result:1 Al //对旧的deepClone中的person重新设置值 shallowClone.getPerson().setName("new Al");//1 new Al //打印新的clone中person的值 System.out.println(clone.getPerson().getId() + " " + clone.getPerson().getName()); }}
浅复制的引用没办法被复制,用的是同一个引用
利用串行化来做深复制
import java.io.*;/** * Created by Ay on 2016/3/16. */public class ShallowClone implements Cloneable,Serializable{ private int id; private String name; //存在引用person类 private Person person; public ShallowClone(int id, String name) { this.id = id; this.name = name; } public Object deepClone()throws Exception{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); //从流里读出来 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bais); return(oi.readObject()); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public static void main(String[] args) throws Exception{ //创建ShallowClone对象,设置值 ShallowClone shallowClone = new ShallowClone(1,"Ay"); Person person = new Person(1,"A1"); shallowClone.setPerson(person); //对ShallowClone对象进行深复制,得到deepClone ShallowClone deepClone = (ShallowClone)shallowClone.deepClone(); System.out.println(deepClone.getId() + " " + deepClone.getName());//result:1 Ay System.out.println(deepClone.getPerson().getId() + " " + deepClone.getPerson().getName());//result:1 A1 shallowClone.getPerson().setId(2); shallowClone.getPerson().setName("Al2"); //无论对ShallowClone中的person如何修改值,都不影响deepClone,因为深复制呗 System.out.println(deepClone.getId() + " " + deepClone.getName());//result:1 Ay System.out.println(deepClone.getPerson().getId() + " " + deepClone.getPerson().getName());//result:1 A1 }}
- 要进行深复制,ShallowClone和Person都要实现Cloneable,Serializable,否则会报错。
参考文章
http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html
0 0
- 论clone深层复制和浅层复制
- java-浅层复制和深层复制
- C++中的浅层复制和深层复制
- java中的深层复制和浅层复制
- c# 浅层复制与深层复制
- 深层复制与浅层复制
- 深层复制与浅层复制
- java对象深层复制和浅复制
- c++一般指针的深层复制和浅层复制(1)
- 深层复制构造函数和浅层复制构造函数区别
- C++_浅层复制构造函数和深层复制构造函数
- Java对象的浅层复制与深层复制
- JAVA浅层复制深层复制理解-java_01_20160824
- 浅表复制和深层复制
- 浅复制和深度复制 clone()
- 浅复制和深度复制 clone()
- Java浅复制和深度复制 clone()
- 深复制和浅复制(clone)
- Java练笔:一个类作为另一个类的参数调用。顺带训练数据在栈和堆的走向。思考若用C++写,delete应该怎么写
- 【CSS3】跨列设置column-span
- 如何使用pyQT做pythonGUI界面?
- 【CSS3】盒子模型
- Hashtable之哈希表一
- 论clone深层复制和浅层复制
- 文章标题
- [leetcode] 273. Integer to English Words 解题报告
- eclipse 连接 habse 问题汇总
- foreach 是传入参数是 Set<Long[]>时,数据循环都是同样数据的问题
- Android学习之位图BitMap
- 【CSS3】伸缩布局
- DE21 Convolution Formula
- DE22 Using Laplace Transform to Solve ODEs with Discontinuous Inputs