请实现对象浅复制与深复制?
浅复制--只对对象及其变量值进行赋值,如果对象中引用了其它对象的话,那么这个对象赋值了以后,其应用对象的地址是不变的。(也就是,这两个完全相同的对象,会指向同一个引用对象)
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}}