浅复制:只对对象以及变量值进行复制,引用对象地址不变
深复制:不仅对对象以及变量值进行复制,对引用对象也复制
import java.io.*;
/**
* 实现对象的浅复制与深复制
*/
public class Dancer implements Cloneable, Serializable {
private static final long serialVersionUID = -5429953184638265377L;
private String name;
private Dancer partner;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dancer getPartner() {
return partner;
}
public void setPartner(Dancer partner) {
this.partner = partner;
}
public Dancer deepClone() {
Dancer target = null;
byte[] byteArr = null;
try(
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
) {
oos.writeObject(this);
byteArr = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
try(
ByteArrayInputStream bais = new ByteArrayInputStream(byteArr);
ObjectInputStream ois = new ObjectInputStream(bais);
) {
target = (Dancer) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return target;
}
public static void main(String[] args) throws CloneNotSupportedException {
Dancer d1 = new Dancer();
d1.setName("朱明远");
Dancer d2 = new Dancer();
d2.setName("刘敏霞");
d1.setPartner(d2);
System.out.println("Partner:" + d2.hashCode());
//浅复制
Dancer shallow = (Dancer) d1.clone();
System.out.println("浅复制:" + shallow.getPartner().hashCode());
//深复制
Dancer deep = d1.deepClone();
System.out.println("深复制:" + deep.getPartner().hashCode());
}
}
