使用串行化实现Java深度克隆

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YaboSun/article/details/82717440

详细参考链接:
https://my.oschina.net/gavinjin/blog/102206
Java实现对象克隆主要有三种方式,克隆又分为浅克隆(Shadow Clone)以及深克隆(Deep Clone),实际工作中应该很少用到浅克隆,这里主要是说明深克隆的实现,具体区别网上很多参考。
首先,创建一个类,这里为了方便理解就以Student类为例:

package seriable.deep.clone;

import java.io.*;

/**
 * Created by hadoop on 18-9-15
 * Student类 实现Serializable接口
 */
public class Student implements Serializable {
    /** 学生姓名 */
    String stuName;
    /** 学生年龄 */
    int stuAge;

    /** 构造函数 */
    public Student(String stuName, int stuAge) {
        this.stuName = stuName;
        this.stuAge = stuAge;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    /** 覆写object中clone方法 */
    @Override
    public Object clone() {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(bais);
            return (ois.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这样就通过串行化实现对象的复制,写一个单元测试来进行测试

package seriable.deep.clone;

import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.io.OptionalDataException;

import static org.junit.jupiter.api.Assertions.*;

/**
 * Created by hadoop on 18-9-15
 */
class StudentTest {

    @Test
    void deepClone() throws OptionalDataException, ClassNotFoundException, IOException {
        Student s1 = new Student("zhangsan", 18);
        Student s2 = (Student) s1.clone();
        System.out.println("学生对象1年龄:" + s1.getStuAge() + "学生对象2年龄:" + s2.getStuAge());

        s1.setStuAge(20);

        assertTrue(s2.getStuAge() == 18);
        assertTrue(s2.getStuName().matches("zhangsan"));
        System.out.println("学生对象1年龄:" + s1.getStuAge() + "学生对象2年龄:" + s2.getStuAge());
    }
}

这里说明一下,就是先输出经过克隆操作以后的s2对象的值,然后通过set方法将s1的值进行改变,如果是浅克隆的话,改变s1,相应的s2也会改变,接着改变以后再输出结果。
这里写图片描述
可以看到s2的值并没有被改变,则成功实现。

猜你喜欢

转载自blog.csdn.net/YaboSun/article/details/82717440
今日推荐