淺度複製 深度複製

2021-09-04 05:25:55 字數 3224 閱讀 3567

深度複製(deep copy):從乙個變數到另乙個變數按值複製物件,即產生乙個和原物件相同的並且沒有任何引用聯絡的物件。

淺度複製(shallow copy):只複製物件的基本型別,而引用型別仍屬於原來的物件。

可以使用systrm.object的memberwiseclone()方法來完成,這是乙個受保護的方法,但很容易再物件上定義乙個呼叫該方法的公共方法,從而實現淺度複製。

class

program

;shallowproto shallowproto=

newshallowproto

(person,20)

;shallowproto shallow =

(shallowproto)shallowproto.

clone()

; console.

writeline

("原型id:,原型age:"

,shallowproto.person.id,shallowproto.age);//

console.

writeline

("淺複製id:,淺複製age:"

, shallow.person.id,shallow.age)

; console.

writeline

("給id和age賦新值後---------");

shallow.person.id =2;

shallow.age =30;

console.

writeline

("原型id:,原型age:"

, shallowproto.person.id, shallowproto.age)

; console.

writeline

("淺複製id:,淺複製age:"

, shallow.person.id, shallow.age)

; console.

readkey()

;}}class

shallowproto

:icloneable

public

int age;

public

person person;

public

shallowproto

(person person,

int age)

}class

person

執行結果:

可見淺複製後,值型別的成員與原型沒有關係,而引用型別會變化。

淺度複製,與直接讓兩個引用的位址相同,淺複製會把值型別複製,引用型別只複製了位址。

class

program

;shallowproto shallowproto=

newshallowproto

(person,20)

;shallowproto shallowproto1 = shallowproto;

console.

writeline

("原型id:,原型age:"

, shallowproto.person.id, shallowproto.age)

; console.

writeline

("引用id:,引用age:"

, shallowproto1.person.id, shallowproto1.age)

; console.

writeline

("給id和age賦新值後---------");

shallowproto1.age =30;

shallowproto1.person.id =2;

console.

writeline

("原型id:,原型age:"

, shallowproto.person.id, shallowproto.age)

; console.

writeline

("引用id:,引用age:"

, shallowproto1.person.id, shallowproto1.age)

; console.

readkey()

;}}class

shallowproto

public

int age;

public

person person;

public

shallowproto

(person person,

int age)

}class

person

執行結果:

兩個變數均引用同乙個物件。

標準的實現方式是:實現icloneable介面,該介面有乙個clone()方法,這個方法不帶引數,返回乙個object型別的結果。

class

program

", deepproto.person.id)

; console.

writeline

("深複製id:"

, deepclone.person.id)

; deepproto.person.id =5;

console.

writeline

("原型id:"

, deepproto.person.id)

; console.

writeline

("深複製id:"

, deepclone.person.id)

; console.

readkey()

;}}public

class

person

}class

deepproto

:icloneable

public

object

clone()

}

深度複製和淺度複製

深度複製和淺度複製的區別在於有沒有為拷貝出的新物件重新分配一塊記憶體區域。淺度拷貝即直接賦值,拷貝的只是原始物件的引用,在堆中仍然公用一塊記憶體,而深度拷貝為新物件在堆中重新分配一塊記憶體,所以對新物件的操作不會影響原始物件 public class person implements clonea...

c 淺度複製和深度複製

有時候我們需要根據乙個物件建立另外乙個相同物件,也就是所謂的複製。複製又分為淺度複製 也有叫影子複製 和深度複製。主要的差別是對於引用型別而言。淺度複製對引用型別只複製引用,及複製後源引用與目標引用的引用型別是指向都乙個物件,操作其中乙個,另外乙個也會受印像。深度複製者源引用和目標引用物件的是兩個不...

java的深度複製和淺度複製

1.比如user類中包含了address類 則淺度複製只是複製了user類,並沒有複製user裡面的address類 而深度複製則是兩者都複製了 具體 如下 user類 class user implements cloneable override protected object clone t...