@test
public void testassign()}
@test
public void testshallowcopy() throws exception
如果是基本資料型別的成員變數,我們轉殖之後彼此的屬性是可以相互不影響的,接著看:
如果增加乙個自定義的類物件時
@data
public class address
測試
@test
public void testshallowcopy() throws exception
輸出結果:
false
p1=person(name=peter, age=31, address=address(type=office, value=北京))
p2=person(name=peter, age=31, address=address(type=office, value=北京))
這是我們可以發現當我對p2物件進行操作的時候,p1物件中address的值也發生了改變,這就是淺拷貝。其實p1物件中address屬性還是引用了p2中的位址。所以p2一改p1也跟著改變了。
前面例項中是淺拷貝和深拷貝的典型用例。
淺拷貝:被複製物件的所有值屬性都含有與原來物件的相同,而所有的物件引用屬性仍然指向原來的物件。
深拷貝:在淺拷貝的基礎上,所有引用其他物件的變數也進行了clone,並指向被複製過的新物件。
也就是說,乙個預設的clone()方法實現機制,仍然是賦值。
如果乙個被複製的屬性都是基本型別,那麼只需要實現當前類的cloneable機制就可以了,此為淺拷貝。
如果被複製物件的屬性包含其他實體類物件引用,那麼這些實體類物件都需要實現cloneable介面並覆蓋clone()方法。
@data
public class address implements cloneable
}這樣還不夠,person的clone()需要顯式地clone其引用成員。
@data
public class person implements cloneable
}
重新跑前面的測試用例:
false
p1=person(name=peter, age=31, address=address(type=home, value=北京))
p2=person(name=peter, age=31, address=address(type=office, value=北京)
現在轉殖後的物件的屬性就也不會跟著改變了 Java中的clone方法
1.功能 由方法名 轉殖 可知是複製乙個物件,方法呼叫後會建立並返回此物件的乙個副本。2.為什麼不用 以賦值的方式建立物件副本?student stu1 new student zhaoliu 18,1996 11 20 student stu2 stu1 stu2.setname lisi sys...
Java中的clone和深度clone
複製物件 or 複製引用 person p new person 23,zhang person p1 p system.out.println p system.out.println p1 當person p1 p 執行之後,是建立了乙個新的物件嗎?首先看列印結果 person p new pe...
java 中的clone 在陣列中
今天在程式設計中遇到發現乙個問題,那就是二維陣列的clone,只有第一層clone了,裡層的還是指向之前的位址 string a string aa a.clone aa 0 22 system.out.println a 0 列印 1 string e string ee e.clone ee 0...