浅克隆与深克隆
对对象进行复制,创建出新的对象,新对象保留原对象的所有属性的值。
浅克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向同一个对象。
深克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向不同的对象。
浅克隆:
需要继承Cloneable接口才能对该类对象进行克隆。
通过clone()方法返回 克隆出的对象。
import java.util.Date;
public class MakkaPakka implements Cloneable{
private int age;
private Date birth;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
return obj;
}
public MakkaPakka(int age, Date birth) {
this.age = age;
this.birth = birth;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
深克隆:
方式一:更改clone()方法,克隆成员变量。
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
MakkaPakka makkaPakka = (MakkaPakka) obj;
makkaPakka.birth = (Date) this.birth.clone();
return obj;
}
方式二:序列化、反序列化
记得继承Serializable接口。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(m1);
byte[] flush = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(flush);
ObjectInputStream ois = new ObjectInputStream(bais);
MakkaPakka m2 = (MakkaPakka) ois.readObject();
原型模式
如果使用new关键字创建对象过程复杂,可以利用克隆大大提高效率。