拷貝物件的三種方式

2021-08-22 17:06:36 字數 2464 閱讀 9099

物件拷貝又叫物件轉殖或物件複製,要求在不影響原物件及其內容的情況下,產生該物件的乙個副本並順利工作。物件轉殖一般用於把物件初始化為預設狀態。根據這幾天的觀察,共總結出三種物件拷貝的方法,下面分別介紹。

在介紹之前,首先要分清淺拷貝和深拷貝之間的區別。所謂淺拷貝,是指拷貝了物件整體的引用或者物件內部某些引用型別的引用,而非引用型別的屬性則拷貝其值。這麼說有些抽象,舉個例子,假如物件obja(a類的乙個例項)有乙個屬性是objb(b類的乙個例項,是引用型別),如果淺拷貝obja到另外乙個a類的例項,那麼只是拷貝了objb的引用,而沒有拷貝其值(當然值也一樣),其他的非引用型別的屬性,則直接拷貝值。淺拷貝拷貝的「量」感覺較少,因為只是拷貝了引用型別的引用而沒有拷貝其值,這樣反而讓兩物件之間的聯絡更加緊密,只要有乙個物件的某個引用型別的屬性變化,都會使另外乙個物件發生同樣的變化,但值型別的卻不會這樣,因為它只是拷貝了值。當然,如果你為了圖省事,直接把obja以賦值的形式賦給了另外乙個物件,那麼本身就是拷貝了這個物件的引用(物件是引用型別),物件內所有屬性,無論是引用型別還是值型別,只要有乙個物件發生變化,另外乙個物件都會發生變化,因為兩個物件指向了同一位址,所以內部屬性當然也指向了統一位址。與淺拷貝不同,深拷貝只是拷貝了obja的屬性的值,即使屬性屬於引用型別,也不會拷貝引用,只是拷貝它的值!於是,兩個物件沒有任何關係,改動其中乙個,不會對另外乙個產生影響。

第一種方法:物件間的直接賦值

用「=」給兩個物件賦值,這是我們經常用到的,但這不是一種好習慣,因為這樣屬於絕對的淺拷貝,兩個物件指向同一位址,共同變化。

eg,假如有乙個teacher類,然後

teacher teatest1 = new teacher();

teacher teatest2 = teatest1;//直接賦值

這樣完成的直接賦值,teatest1和teatest2實際上是同乙個物件,兩物件指向同一位址,只要其中任何乙個物件變化,都會引起另外乙個的變化,無論什麼屬性。所以,這是一種絕對的淺拷貝方式。

第二種方法:物件屬性間的賦值

第一種方法是用「=」給物件賦值,這次是用「=」給物件的屬性賦值,這就存在這樣一種問題,如果該屬性是引用型別的,則其中乙個物件該屬性變化,一定會影響到另外乙個物件的該屬性,即兩屬性指向同一位址;如果該屬性是值型別,則只是拷貝了該屬性的值,其中乙個物件該屬性的變化,不再影響到另外乙個物件該屬性的值。

通常這種對屬性的賦值,是在類的建構函式內實現的。eg,部分屬性的賦值,則用直接賦值,若所有屬性都賦值,則可以使用反射機制來實現。

using

system;

using

system.reflection;

namespace

利用反射拷貝物件

;//拷貝物件屬性的全部還是部分

public

class teacher

set}

public

int salaryset}

public

string deptset}

public teacher()//

建構函式1

public teacher(int grade,int salary,string dept)//

建構函式2

public teacher(teacher teach,initializemethods initm)//

建構函式3

else

if(initm == initializemethods.allinitialize)//

利用反射機制獲得物件teach的所有屬性資訊並拷貝到另乙個物件 );

} }} }

}第三種方法:使用icloneable介面進行深拷貝

egusing

system;

namespace

icloneable

介面的用途

public women(string strn,int inta,men menm)

private

string strname;

private

int intage;

private men menmale;

public

string name

get }

public

int age

get }

public men male

get }

#region

icloneable 成員

public

object clone()

// public object clone()//

這個屬於淺拷貝

// #endregion }

}使用時,women womentest 2= womentest1.clone();

或者通過介面進行呼叫,更加有利於程式的整合。eg

icloneable pc = womentest1;

women womentest2 = pc.clone();

阻止拷貝的三種方式

有些時候我們在定義乙個類的時候不希望其中的拷貝控制成員 拷貝構造和拷貝賦值 起作用,也就是阻止拷貝,這時候可能有人會想,那我們乾脆不定義這樣的拷貝控制函式不就ok了,但悲催的是如果自己不定義,好心的編譯器也會及時的學習雷鋒好榜樣幫你合成定義,即傳說中的合成拷貝構造 合成拷貝賦值。既然如此,應該如何操...

java深拷貝的三種方式

問題 spring boot jpa專案中,修改某個物件以後需要生成乙個vo物件給客戶端,資料庫對應的pojo物件裡有個map型別的物件 名字叫para 這個物件的value又是個map,我使用map的putall 方法拷貝了乙份para,然後修改裡面的值,最後發現para的內容也被修改了。示例 如...

建立物件的三種方式

三 字面量方式建立物件 總結呼叫系統的建構函式建立物件 var 變數名 newobject object 是系統的建構函式自定義建構函式建立物件 結合第一種和需求通過工廠模式建立物件 字面量的方式建立物件 例項化物件 var obj newobject 物件有特徵 屬性 和行為 方法 新增屬性 物件...