對象拷貝有時讓我們忽視其重要性,又或者因為想當然而導致若干程序問題。
淺拷貝
淺拷貝即普通拷貝,即對要拷貝的對象進行復制。例如對於Entity類:
class Entity{
int a;
String b;
List<String> c;
List<Object> d;
}
對於Entity類的對象entity,把entity的對象直接賦給另一個變量也算是一種淺拷貝,這樣就有兩個變量指向堆中同一個對象。更近一層的淺拷貝是還要對
entity對象中的各個屬性進行復制,即重新new一個Entity類對象,再將a、b、c、d屬性復制賦給新創建的對象:
Entity entity2 = new Entity();
entity2.a = entity.a;
entity2 b = entity.b;
entity2.c = entity.c;
entity2.d = entity.d;
這樣得到的拷貝對象是一種淺拷貝,因為這樣直接賦值的結果是對於對象屬性,兩個對象entity和entity2中對應的屬性還是指向同一塊內存區域,二者並非
真正獨立。如此若要對其中的屬性進行改變,則會同時影響這兩個對象。
即使對對象屬性進行重新new出新空間,重新按元素賦值,也不能保證屬性對象中的屬性也是對象,這樣層層推進,操作起來很是不便。
深拷貝
要實現深拷貝,除了逐層賦值之外,還有一種比較簡單直觀的方式即序列化。序列化將內存對象以文件的形式保存在磁盤,若要重新恢復到內存,需要重新
開辟內存,這樣兩個對象就會實現完全獨立,互不影響,但是需要對不能序列化的字段進行單獨處理。