對(duì)象的深拷貝實(shí)現(xiàn)方法 編程里面的深拷貝和淺拷貝各是什么意思,怎么理解這兩個(gè)?
編程里面的深拷貝和淺拷貝各是什么意思,怎么理解這兩個(gè)?淺拷貝意味著源對(duì)象和拷貝對(duì)象共享同一個(gè)實(shí)體,只是引用的變量不同(名稱不同)。對(duì)其中一個(gè)對(duì)象的更改會(huì)影響另一個(gè)對(duì)象。例如,一個(gè)人的名字起初是張三,后
編程里面的深拷貝和淺拷貝各是什么意思,怎么理解這兩個(gè)?
淺拷貝意味著源對(duì)象和拷貝對(duì)象共享同一個(gè)實(shí)體,只是引用的變量不同(名稱不同)。對(duì)其中一個(gè)對(duì)象的更改會(huì)影響另一個(gè)對(duì)象。例如,一個(gè)人的名字起初是張三,后來(lái)改成了李四,但卻是同一個(gè)人。無(wú)論是張三缺胳膊缺腿,還是李四缺胳膊缺腿,都是同一個(gè)人的厄運(yùn)。深度復(fù)制是指源對(duì)象和復(fù)制對(duì)象相互獨(dú)立,任何對(duì)象的改變都不會(huì)影響到另一個(gè)對(duì)象。例如,一個(gè)叫張三的人被用來(lái)克隆另一個(gè)叫李四的人。不管張三缺胳膊缺腿,李四缺胳膊缺腿,都不會(huì)影響別人。典型的是值對(duì)象,例如預(yù)定義的類型int32、double、struct、enum等
PHP對(duì)象的淺復(fù)制與深復(fù)制的實(shí)例詳解?
原型模式
使用原型實(shí)例指定要?jiǎng)?chuàng)建的對(duì)象的類型,并通過(guò)復(fù)制這些原型來(lái)創(chuàng)建新對(duì)象
原型模式基于深度復(fù)制和淺層復(fù)制。在Java中,有兩種拷貝:
shallow copy
拷貝一個(gè)對(duì)象后,會(huì)生成一個(gè)新的對(duì)象。新對(duì)象的所有成員變量(基本類型或引用類型)都包含與原始對(duì)象相同的對(duì)象
如果原始對(duì)象的成員變量是基本數(shù)據(jù)類型,則此變量的值將復(fù)制到新對(duì)象。如果原始對(duì)象的成員變量是引用數(shù)據(jù)類型,則此引用指向的對(duì)象將不會(huì)生成新的引用,而是
新對(duì)象中的引用和原始對(duì)象的引用指向同一對(duì)象。
深度復(fù)制
復(fù)制對(duì)象后,將生成一個(gè)新對(duì)象。新對(duì)象的基本數(shù)據(jù)類型變量包含與原始對(duì)象相同的值。例如
如果原始對(duì)象的成員變量是引用數(shù)據(jù)類型,則在新對(duì)象中,這些引用變量將指向復(fù)制的新對(duì)象,而
不再指向原始引用對(duì)象。深度復(fù)制將復(fù)制被復(fù)制對(duì)象引用的所有對(duì)象。
例如:
有一個(gè)對(duì)象a,它被復(fù)制以生成對(duì)象B。如果對(duì)象a中有一個(gè)int類型變量I的值為4,則對(duì)象B中的int值也是4。將a改為int類型變量不會(huì)影響B(tài)。如果a中有一個(gè)引用類型為
的成員變量C,它將指向?qū)ο驞。復(fù)制后,B中也會(huì)有一個(gè)C,它也指向?qū)ο驞,a的C和B的C指向同一個(gè)
對(duì)象D,這是淺層復(fù)制。如果是深度復(fù)制,a中的C指向一個(gè)D對(duì)象,B中的C指向一個(gè)新對(duì)象
,它們不會(huì)指向同一個(gè)對(duì)象。這樣,對(duì)原始對(duì)象中成員變量C指向的對(duì)象D所做的任何更改都不會(huì)影響新對(duì)象。
舉一個(gè)最簡(jiǎn)單的例子:
classA{
publicinti
publicintj
}
AA=newa()
淺拷貝:
Aa1=a
深拷貝:
Aa1=newa()
A1。I=A.I
A1。J=A.J
感覺(jué)如下:
淺拷貝只復(fù)制對(duì)象本身
深拷貝復(fù)制對(duì)象中引用的對(duì)象并繼續(xù)復(fù)制。
淺拷貝與深拷貝的區(qū)別是什么?
1. 深拷貝和淺拷貝都是源對(duì)象的拷貝,占用不同的內(nèi)存空間。
2. 不可變類型的對(duì)象對(duì)深副本和淺副本沒(méi)有影響,并且最終地址值和值是相等的。
3. 變量類型:
=淺復(fù)制:等值,等地址
淺復(fù)制:等值,不等地址
深復(fù)制:等值,不等地址