3 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
術(shù)語(yǔ)“克隆”是不明確的(盡管Java類庫(kù)包括Cloneable接口),并且可以引用深拷貝或淺拷貝。深/淺副本不是專門與Java相關(guān)聯(lián)的,而是與制作對(duì)象副本有關(guān)的一般概念,并且指的是如何復(fù)制對(duì)象的成員。
舉個(gè)例子,假設(shè)你有一個(gè)人類:
class Person { String name; List<String> emailAddresses}
你如何克隆這個(gè)類的對(duì)象?如果要執(zhí)行淺表副本,則可以復(fù)制名稱并emailAddresses
在新對(duì)象中添加引用。但是如果你修改了emailAddresses
列表的內(nèi)容,你將修改兩個(gè)副本中的列表(因?yàn)檫@是對(duì)象引用的工作方式)。
深層復(fù)制意味著您遞歸復(fù)制每個(gè)成員,因此您需要為new創(chuàng)建一個(gè)新List
的Person
,然后將內(nèi)容從舊對(duì)象復(fù)制到新對(duì)象。
雖然上面的示例很簡(jiǎn)單,但深度和淺份副本之間的差異很大,并且對(duì)任何應(yīng)用程序都有重大影響,特別是如果您要提前設(shè)計(jì)一個(gè)通用的克隆方法,而不知道某人以后如何使用它。有時(shí)候你需要深層或淺層語(yǔ)義,或者某些混合,你可以深層復(fù)制某些成員但不需要其他成員。

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
深層復(fù)制:克隆此對(duì)象以及對(duì)其具有的每個(gè)其他對(duì)象的每個(gè)引用
淺拷貝:克隆此對(duì)象并保留其引用
Object clone()拋出CloneNotSupportedException:沒(méi)有指定它是應(yīng)該返回深拷貝還是淺拷貝,但至少是:o.clone()!= o
添加回答
舉報(bào)