实现方法:先对对象进行序列化,然后反序列化出。
package com.cc.datastructuresandalgorithm.part1;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.*;
/**
* @Author: cc
* @Date: 2022/5/18 12:36
* @Description:
* @company:
*/
@Data
@AllArgsConstructor
public class TestReen implements Cloneable, Serializable {
private int id;
private String name;
private SonReen sonReen;
public Object deepClone() throws Exception{
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bo);
out.writeObject(this);
ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}
public static void main(String[] args) throws Exception {
SonReen sonReen = new SonReen(1, "张三");
TestReen t1 = new TestReen(1, "李四", sonReen);
TestReen t2 = (TestReen)t1.deepClone();
System.out.println("t1 == t2?"+(t1==t2));
System.out.println("t1.sonReen==t2.sonReen?"+(t1.getSonReen()==t2.getSonReen()));
System.out.println("T name?"+(t1.getName()==t2.getName()));
System.out.println("S name?"+(t1.getSonReen().getSonName()==t2.getSonReen().getSonName()));
SonReen son = new SonReen(1, "王五");
t2.setSonReen(son);
System.out.println("son:"+t1.getSonReen().getSonName());
System.out.println("son2:"+t2.getSonReen().getSonName());
System.out.println("son ==son2?"+(t1.getSonReen()==t2.getSonReen()));
}
}
@Data
@AllArgsConstructor
class SonReen implements Serializable{
private int sonId;
private String sonName;
}
运行结果:
深克隆会使t1.getName()==t2.getName(),t1.getSonReen().getSonName()==t2.getSonReen().getSonName() 也变成false