详细参考链接:
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的值并没有被改变,则成功实现。