请实现对象浅复制与深复制?

浅复制--只对对象及其变量值进行赋值,如果对象中引用了其它对象的话,那么这个对象赋值了以后,其应用对象的地址是不变的。(也就是,这两个完全相同的对象,会指向同一个引用对象)


public class Dancer implements Cloneable {
    private  String name;
    private  Dancer partner;

    public static void main(String[] args) throws CloneNotSupportedException {
        Dancer dancer = new Dancer("刘明");
        Dancer dancer1 = new Dancer("吴彦祖");
        dancer.setPartner(dancer1);
        shallowClone(dancer, dancer1);
    }

    private static void shallowClone(Dancer dancer, Dancer dancer1) throws CloneNotSupportedException {
        System.out.println(" =============浅复制:只对对象和和变量值进行复制,引用对象的地址不变================ ");
        System.out.println("dancer1 = " + dancer1.hashCode());
        System.out.println(dancer1);
        Dancer clone = (Dancer) dancer.clone();

        System.out.println("dancer1 = " + clone.getPartner().hashCode());
        System.out.println("clone = " + clone);

        System.out.println(" =============浅复制:引用对象值被更改,拷贝对象的引用对象也发生变化================ ");
        dancer1.setName("吴彦祖好帅");
        System.out.println(dancer1);
        System.out.println("clone = " + clone);

        System.out.println(" =============浅复制:对象和和变量改变,拷贝对象的不变================ ");
        dancer.setName("刘明好美");
        System.out.println("clone = " + clone);

    }

output

# =============浅复制:只对对象和和变量值进行复制,引用对象的地址不变================ 
dancer1 = 558638686
Dancer{name='吴彦祖', partner=null}
dancer1 = 558638686
clone = Dancer{name='刘明', partner=Dancer{name='吴彦祖', partner=null}}
# =============浅复制:引用对象值被更改,拷贝对象的引用对象也发生变化================ 
Dancer{name='吴彦祖好帅', partner=null}
clone = Dancer{name='刘明', partner=Dancer{name='吴彦祖好帅', partner=null}}
# =============浅复制:对象和和变量改变,拷贝对象的不变================ 
clone = Dancer{name='刘明', partner=Dancer{name='吴彦祖好帅', partner=null}}
dancer = Dancer{name='刘明好美', partner=Dancer{name='吴彦祖好帅', partner=null}}

深复制--不仅对象及其变量值进行复制,就连引用对象也进行复制。复制的两个对象,都有自己独立的引用对象,彼此互不干扰。

package top.xiongmingcai.bbs.clone;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

import java.io.*;

public class Dancer implements Cloneable, Serializable {
    private String name;
    private Dancer partner;

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Dancer dancer = new Dancer("刘明");
        Dancer dancer1 = new Dancer("吴彦祖");
        dancer.setPartner(dancer1);
//        shallowClone(dancer, dancer1);
        Dancer clone = dancer.deepClone();
        System.out.println("# =============深复制:对象、变量值和引用对象都进行复制 ================ ");
        System.out.println("dancer1 = " + dancer1.hashCode());
        System.out.println(dancer1);

        System.out.println("dancer1 = " + clone.getPartner().hashCode());
        System.out.println("clone = " + clone);
        System.out.println("# =============深复制:对象、变量值和引用对象都进行复制,================ ");
        dancer1.setName("吴彦祖好帅");
        System.out.println(dancer1);
        System.out.println("clone = " + clone);
    }

    public Dancer deepClone() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        //字节数组还原成对象
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (Dancer) ois.readObject();
    }

output

# =============深复制:对象、变量值和引用对象都进行复制 ================ 
dancer1 = 1349393271
Dancer{name='吴彦祖', partner=null}
dancer1 = 589873731
clone = Dancer{name='刘明', partner=Dancer{name='吴彦祖', partner=null}}
# =============深复制:对象、变量值和引用对象都进行复制,================ 
Dancer{name='吴彦祖好帅', partner=null}
clone = Dancer{name='刘明', partner=Dancer{name='吴彦祖', partner=null}}

浅复制和深复制区别? · MingCaiXiong/spring-boot-bbs@ececc30