浅谈对象的克隆

一、对象的浅克隆

对象浅克隆要注意的细节:

  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。

Person类中,引用了Address类,我们通过浅克隆来观察结果:

class Address implements Cloneable ,Serializable{
    String city;

    public Address(String city) {
        super();
        this.city = city;
    }
    
}
public class Person implements Cloneable ,Serializable{
    int id;
    String name;
    Address address;
    public Person(int id, String name, Address address) {
        super();
        this.id = id;
        this.name = name;
        this.address = address;
    }
    public String toString(){
        return "编号:"+ this.id+" 姓名:"+ this.name+" 地址:"+ address.city;
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

 

当我们克隆了p1,然后更改p2的city,p1和p2都改变了,也就是上边所说的第3点:对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。

二、对象深拷贝

对象的深克隆就是利用对象的输入输出流把对象先写到文件上,然后再读取对象的信息这个过程就称作为对象的深克隆

深复制把要复制的对象所引用的对象都复制了一遍

public class Demo2 {
    public static void main(String[] args) throws Exception {
        Address address=new Address("上海");
        Person person1=new Person(1,"萧山",address);
        writeObj(person1);
        Person person2=readObj();
        person2.address.city="河南";
        System.out.println(person1);
        System.out.println(person2);
    }
    public static void writeObj(Person p) throws Exception{
        File file=new File("D:\\obj.txt");
        FileOutputStream fileOutputStream=new FileOutputStream(file);
        ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(p);
    }
    public static Person readObj() throws Exception {
        File file=new File("D:\\obj.txt");
        FileInputStream fileInputStream=new FileInputStream(file);
        ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
        return (Person) objectInputStream.readObject();
    }
}

当我们克隆了p1,然后更改p2的city,p1就不会改变了,也就是把Address也复制了一份。

 

posted @ 2015-12-25 20:29  好人难寻  阅读(216)  评论(0编辑  收藏  举报