开心一笑
什么是制度?
二嫂为了改二哥晚回家的习惯,跟二哥订了个制度,晚上11点不回家就锁门!第一周很奏效,第二周二哥毛病又犯了,二嫂果断执行制度,把门锁了。结果二哥干脆不回家了。
二嫂很郁闷,难道制度订错了吗? 后来经过党的群众路线教育实践活动督导组指点,修改制度:晚11点不回家,我就开着家门睡觉!谁想来就来。二哥大惊,从此11点之前准时回家。
视频教程
大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……
视频地址:http://edu.csdn.net/lecturer/994
自我介绍
浅层复制与深层复制概念:
浅层复制: 浅层复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深层复制:深层复制要复制的对象引用的对象都复制一遍。
我的特长
/**
* 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