在Java中,對象的復制操作分為兩種:深拷貝和淺拷貝。深拷貝指的是復制一個對象及其所有的屬性和嵌套對象,而淺拷貝只是復制一個對象和其基本屬性,而不復制包含的嵌套對象。
//示例代碼 public class Person implements Cloneable{ private String name; private Address address; //構造方法、Getter、Setter省略 //淺拷貝 public Object shallowClone() throws CloneNotSupportedException{ return super.clone(); } //深拷貝 public Object deepClone() throws IOException, ClassNotFoundException{ ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return oi.readObject(); } }
上面是一個示例代碼,有一個Person類和一個Address類。Person類中包含了一個Address屬性,用于表示這個人的住址。下面我們看看深拷貝和淺拷貝的區別。
淺拷貝
Person p1 = new Person("張三", new Address("中國", "北京")); Person p2 = (Person) p1.shallowClone(); System.out.println(p1 == p2); //false System.out.println(p1.getAddress() == p2.getAddress()); //true
上面的淺拷貝只復制了p1和p2的基本屬性,而沒有復制Address屬性,所以p1和p2的Address屬性引用的是同一個對象。
深拷貝
Person p1 = new Person("張三", new Address("中國", "北京")); Person p2 = (Person) p1.deepClone(); System.out.println(p1 == p2); //false System.out.println(p1.getAddress() == p2.getAddress()); //false
上面的深拷貝復制了p1和p2的所有屬性,包括Address屬性,所以p1和p2的Address屬性引用的是不同的對象。
綜上所述,淺拷貝只復制基本屬性,而深拷貝會復制整個對象,包括包含的對象。