java實現對象的淺複製與深複製

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章