引用拷貝
二者的引用是同一個對象,並沒有創建出一個新的對象
因為是同一個對象的引用,所以兩者改一個,另一個對象的值也隨之改變
淺拷貝
淺拷貝是按位拷貝對象,它會創建一個新對象,這個對象有着原始對象屬性值的一份精確拷貝
如果屬性是基本類型,拷貝的就是基本類型的值;
如果屬性是引用類型,拷貝的就是內存地址(即復制引用但不復制引用的對象) ,因此如果其中一個對象改變了這個地址,就會影響到另一個對象。
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
深拷貝
被拷貝對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。
那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。
@Override protected Object clone() throws CloneNotSupportedException { Person newPerson = (Person)super.clone(); newPerson.address = (Address) newPerson.address.clone(); return newPerson; }
通過對象序列化實現深拷貝
將對象序列化為字節序列后,默認會將該對象的整個對象圖進行序列化,再通過反序列即可完美地實現深拷貝。
public class Person implements Serializable, Cloneable{ public Object deepClone() { try { ByteArrayOutputStream bo= new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bo); os.writeObject(this); ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi=new ObjectInputStream(bi); return(oi.readObject()); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } }