JAVA 物件轉殖clone

2021-06-13 12:44:59 字數 1763 閱讀 9604

有時候我們希望轉殖乙個已存在的物件,並對其進行操作,但是不希望改變原物件,這時使用clone技術就非常方便了。但是使用clone,也有一些需要注意的地方,因為clone有淺層轉殖和深層轉殖。還是習慣先直接上**,結合**講解。

注:如果你希望某個類具有clone功能,該類必須實現介面cloneable,它是乙個標識介面,告訴jvm,這個類具有clone權利。

為了方便測試,

以下**寫得很隨便,沒有按照規範些,呵呵。

public class a implements cloneablecatch(clonenotsupportedexception e)

return a;

}}

public class b

public class c 

public static void print(a a)

}

看看執行結果:

a1轉殖前:

num=10    name=a1   nicknames[0]=a1-1    nicknames[1]=a1-2    b.name=a1.b

轉殖物件a2:

num=20    name=a2   nicknames[0]=a2-1    nicknames[1]=a2-2    b.name=a2.b

a1轉殖後:

num=10    name=a1   nicknames[0]=a2-1    nicknames[1]=a2-2    b.name=a2.b

發現a1除了int num,string name的內容沒變,其它都變了,這是怎麼回事呢?這就是所謂的淺層轉殖,也就是轉殖不徹底,畫張草圖表示下.

發現雖然引用物件a1和引用物件a2都指向了各自的例項物件,但是他們的例項物件內部的陣列物件和類物件引用(除了string)都指向了同一處。為了解決這問題,就需要深層轉殖。

a**修改如下。

public class a implements cloneablecatch(clonenotsupportedexception e)

return a;

}}

由於a中對b進行了轉殖,所以b也必須實現介面cloneable

public class b implements cloneablecatch(clonenotsupportedexception e)

return b;

}}

測試類c不需修改,再看看執行結果。

a1轉殖前:

num=10    name=a1   nicknames[0]=a1-1    nicknames[1]=a1-2    b.name=a1.b

轉殖物件a2:

num=20    name=a2   nicknames[0]=a2-1    nicknames[1]=a2-2    b.name=a2.b

a1轉殖後:

num=10    name=a1   nicknames[0]=a1-1    nicknames[1]=a1-2    b.name=a1.b

發現a2就算進行了修改也無法影響到a1了,這就是我們要的效果

PHP轉殖物件clone

有的時候我們需要在乙個專案裡面,使用兩個或多個一樣的物件,如果你使用 new 關鍵字重新建立物件的話,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯,所以要根據乙個物件完全轉殖出乙個一模一樣的物件,是非常有必要的,而且轉殖以後,兩個物件互不干擾。class person 這個人可以說話的方法,說出...

物件的轉殖(clone)

讓物件obj1轉殖物件obj var obj var obj1 function clone origin,target clone obj,obj1 使用for.in把obj物件的每乙個屬性值提取出來並賦值給物件obj1,這就完成了轉殖。關於以上那個轉殖,為了防止使用者不傳target的形參或者是...

轉殖物件 clone 方法

有的時候我們需要在乙個專案裡面,使用兩個或多個一樣的物件,如果你使用 new 關鍵字重新建立物件的話,再賦值上相同的屬性,這樣做比較煩瑣而且也容易出錯,所以要根據乙個物件完全轉殖出乙個一模一樣的物件,是非常有必要的,而且轉殖以後,兩個物件互不干擾。在php4中我們使用 clone 這個關鍵字轉殖物件...