Java的克隆

Java 深度克隆
Java克隆分为2种:

在了解克隆之前,要先了解Object的Clone()函数:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,
则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

(1)浅度克隆:Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,
* 那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,
* 但是基本数据类型是会跟着被带到克隆对象里面去的.浅拷贝对于基本类型和字符串String类型有效.


public static class Person implements Cloneable {
public String name;
public String sex;
public int[] a;


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int[] getA() {
return a;
}

public void setA(int[] a) {
this.a = a;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", a=" + Arrays.toString(a) +
'}';
}
}
(2)深度克隆:深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去,需要继承Serializable,同时将对象写入流中
public static class PersonDeep implements Serializable,Cloneable {

public String name;
public String sex;
public ArrayList<String> list;


public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public ArrayList<String> getList() {
return list;
}

public void setList(ArrayList<String> list) {
this.list = list;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}

@Override
public String toString() {
return "PersonDeep{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", list=" + list +
'}';
}
}

public static PersonDeep deepClone(PersonDeep personDeep) throws IOException,ClassNotFoundException{
//将对象写入流中
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(personDeep);
//从流中取出
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return (PersonDeep)objectInputStream.readObject();

}

posted on 2019-01-22 15:09  Mofitor  阅读(191)  评论(0编辑  收藏  举报

导航