对象克隆(浅克隆、深克隆)

1、浅克隆

(1)概念

对象的复制,完整地复制一个对象

(2)克隆细节分析

Object类:

依靠Object类,Object类中含有对象的克隆方法

创建并返回此对象的副本。 “复制”的精确含义可能取决于对象的类。
protected Object clone()   throws CloneNotSupportedException

Cloneable接口:

该接口无操作方法,是一个标识接口,但是要实现对象的克隆必须实现此接口

(3)克隆操作

实现接口并重写方法:

public class Person implements Cloneable {
    private String name;
    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
    protected Object clone()   throws CloneNotSupportedException{
        return super.clone();//具体的操作由父类来完成
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1=new Person("Tom");
        Person person2=(Person)person1.clone();
        person2.setName("Jack");
        System.out.println(person1);
        System.out.println(person2);
    }
}

实现对象的克隆需要实现Cloneable接口并重写Object类的clone()方法。

测试:

Person{name='Tom'}
Person{name='Jack'}

2、深度克隆(利用序列化和反序列化)

(1)创建Person类并实现序列化接口:

import java.io.Serializable;
public class Person implements Serializable {
    private String name;
    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

要实现序列化或反序列化必须实现接口Serializable 

(2)运用序列化与反序列化实现对象的克隆:

import java.io.*;
public class CloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("Tom");
        try {
            ByteArrayOutputStream bas =new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bas);
            oos.writeObject(person1);
            ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bas.toByteArray()));
            Person person2 =(Person) ois.readObject();
            person2.setName("Jack");
            bas.flush();
            oos.flush();
            bas.close();
            oos.close();
            ois.close();
            System.out.println(person1);
            System.out.println(person2);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
Person{name='Tom'}
Person{name='Jack'}

猜你喜欢

转载自www.cnblogs.com/zhai1997/p/12724315.html