有時候我們希望轉殖乙個已存在的物件,並對其進行操作,但是不希望改變原物件,這時使用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 這個關鍵字轉殖物件...