浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
package test1;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Demo1 {
public static void main(String[] args) throws Exception {
Obj obj = new Obj();
obj.setaString("aaa");
KKK kkk = new KKK();
kkk.setAaa("sss");
obj.setKkk(kkk);
Obj obj2 = (Obj) obj.clone();//deepClone()
System.out.println("obj===" + obj);
System.out.println("obj2===" + obj2);
obj2.getKkk().setAaa("bbb");
System.out.println("obj===" + obj);
System.out.println("obj2===" + obj2);
}
}
class Obj implements Cloneable, Serializable {
private String aString;
private KKK kkk;
public Obj() {
System.out.println("Obj()");
}
public String getaString() {
return aString;
}
public void setaString(String aString) {
this.aString = aString;
}
public KKK getKkk() {
return kkk;
}
public void setKkk(KKK kkk) {
this.kkk = kkk;
}
@Override
public String toString() {
return "Obj [aString=" + aString + ", kkk=" + kkk + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
//深拷贝
protected Object deepClone() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutputStream ooStream = new ObjectOutputStream(bos);
ooStream.writeObject(this);
ooStream.close();
byte[] bb = bos.toByteArray();
InputStream inputStream = new ByteArrayInputStream(bb);
ObjectInputStream oisInputStream = new ObjectInputStream(inputStream);
Object clone = oisInputStream.readObject();
oisInputStream.close();
return clone;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
class KKK implements Serializable {
private String aaa;
public String getAaa() {
return aaa;
}
public void setAaa(String aaa) {
this.aaa = aaa;
}
@Override
public String toString() {
return "KKK [aaa=" + aaa + "]";
}
}
浅拷贝
package test;
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
TempObject tempObject = new TempObject();
tempObject.setProperties1("1");
tempObject.setProperties2("1");
Obj obj = new Obj();
obj.setAaa(1);
obj.setBbb(tempObject);
Obj obj2 = (Obj)obj.clone();
System.out.println("first print:" + obj2);
tempObject.setProperties1("2");
System.out.println("final print:" + obj2);
}
}
class Obj implements Cloneable {
private int aaa;
private TempObject bbb;
public int getAaa() {
return aaa;
}
public void setAaa(int aaa) {
this.aaa = aaa;
}
public TempObject getBbb() {
return bbb;
}
public void setBbb(TempObject bbb) {
this.bbb = bbb;
}
@Override
public String toString() {
return "Obj [aaa=" + aaa + ", bbb=" + bbb + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class TempObject {
private String properties1;
private String properties2;
public String getProperties1() {
return properties1;
}
public void setProperties1(String properties1) {
this.properties1 = properties1;
}
public String getProperties2() {
return properties2;
}
public void setProperties2(String properties2) {
this.properties2 = properties2;
}
@Override
public String toString() {
return "TempObject [properties1=" + properties1 + ", properties2=" + properties2 + "]";
}
}
网友评论