克隆、复制一个类,分为:浅克隆、深克隆。
浅克隆:该类的成员对象的引用还是原来对象的引用。
深克隆:该类是复制的全新的一个类。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
*
* @author: muyichun
* @date : 2016年3月22日10:49:47
* @function: 原型模式
*/
public class Main{
public static void main(String[] args) {
Prototype p1 = new Prototype();
//浅克隆
Prototype p2 = (Prototype) p1.clone();
System.out.println(p2.a);
System.out.println(p2.s);
p1.test.test1 = 3;
System.out.println(p2.test.test1);
System.out.println("---------------------------------------");
//深克隆
p2 = (Prototype) p1.deepclone();
System.out.println(p2.a);
System.out.println(p2.s);
p1.test.test1 = 100;
System.out.println(p2.test.test1);
}
}
class Prototype implements Cloneable,Serializable{
private static final long serialVersionUID = 1L;
public int a = 3;
public String s = "123";
public Test test = new Test();
/**
* 浅复制 —— 类的成员对象只保留引用而不重新new
*/
public Object clone(){
Prototype proto = null;
try {
proto = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return proto;
}
/**
* 深复制
*/
public Object deepclone(){
//写入当前对象的二进制流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(bos);
oos.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
}
//读取二进制流产生的新对象
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois;
try {
ois = new ObjectInputStream(bis);
return ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
class Test implements Serializable{
public int test1 = 1;
}
——贴上自己喜欢的代码!