淺複製:只對對象以及變量值進行復制,引用對象地址不變
深複製:不僅對對象以及變量值進行復制,對引用對象也複製
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());
}
}