深拷貝(深複制)和淺拷貝(淺複制)是兩個比較通用的概念,尤其在C++語言中,若不弄懂,則會在delete的時候出問題,但是我們在這幸好用的是Java。雖然java自動管理對象的回收,但對于深拷貝(深複制)和淺拷貝(淺複制),我們還是要給予足夠的重視,因為有時這兩個概念往往會給我們帶來不小的困惑。
淺拷貝是指拷貝對象時僅僅拷貝對象本身(包括對象中的基本變量),而不拷貝對象包含的引用指向的對象。深拷貝不僅拷貝對象本身,而且拷貝對象包含的引用指向的所有對象。舉例來說更加清楚:對象A1中包含對B1的引用,B1中包含對C1的引用。淺拷貝A1得到A2,A2 中依然包含對B1的引用,B1中依然包含對C1的引用。深拷貝則是對淺拷貝的遞歸,深拷貝A1得到A2,A2中包含對B2(B1的copy)的引用,B2 中包含對C2(C1的copy)的引用。
若不對clone()方法進行改寫,則調用此方法得到的對象即為淺拷貝,下面我們着重談一下深拷貝。
運作下面的程式,看一看淺拷貝:
?
s2變了,但s1也變了,證明s1的p和s2的p指向的是同一個對象。這在我們有的實際需求中,卻不是這樣,因而我們需要深拷貝:
?
當然我們還有一種深拷貝方法,就是将對象串行化:
?
但是串行化卻很耗時,在一些架構中,我們便可以感受到,它們往往将對象進行串行化後進行傳遞,耗時較多。