1.功能
由方法名(轉殖)可知是複製乙個物件,方法呼叫後會建立並返回此物件的乙個副本。
2.為什麼不用 「=」 以賦值的方式建立物件副本?
student stu1 = new student("zhaoliu",18,"1996-11-20");
student stu2 = stu1;
stu2.setname("lisi");
system.out
.println(stu1);
system.out
.println(stu2);
//執行結果:
student [name=lisi, age=18, birthday=1996-11-20]
student [name=lisi, age=18, birthday=1996-11-20]
這裡只對stu2的name屬性重新賦值,然而stu1的name屬性值也改變了.
再看下面的**
student stu1 = new student("deng",18,"1996-11-20");
student stu2 = stu1;
system.out
.println(stu1.hashcode());
system.out
.println(stu2.hashcode());
把物件stu1賦值給stu2, 其實只是將物件的引用賦值給了stu2, 將兩個物件的hashcode列印.
可以看出,stu1和stu2其實是同乙個物件.
可見要複製乙個物件,用」=」是不可行的.
2.clone的使用方法
實現cloneable介面,重寫clone方法.
student stu1 = new student("zhaoliu",18,"1996-11-20");
student stu2 = (student) stu1.clone();
stu2.setname("lisi");
system.out
.println(stu1);
system.out
.println(stu2);
system.out
.println(stu1.hashcode());
system.out
.println(stu2.hashcode());
執行結果如下
從**執行結果可以看出, 現在的stu2和stu1是兩個不同的物件.
3.深拷貝和淺拷貝
clone方法雖實現了物件的複製,這裡存在乙個深拷貝和淺拷貝的問題.
student stu1 = new student("zhaoliu",18,"1996-11-20");
student stu2 = (student) stu1.clone();
system.out
.println(stu1.getname().hashcode());
system.out
.println(stu2.getname().hashcode());
執行結果:
-323273412
-323273412
可見兩個物件的name屬性是同乙個string物件.
當改變stu1的 name屬性值後
student stu1 = new student("zhaoliu",18,"1996-11-20");
student stu2 = (student) stu1.clone();
stu2.setname("lisi");
system.out
.println(stu1.getname().hashcode());
system.out
.println(stu2.getname().hashcode());
system.out
.println(stu1.getname());
system.out
.println(stu2.getname());
執行結果:
-323273412
3322003
zhaoliu
lisi
由此可知,雖然兩個物件中的string物件在clone後string物件引用相同,但當改變其中乙個值的內容後,不會影響另乙個物件.
對於數值型別(int,long,float等)拷貝後直接將值賦值給新的物件屬性, 對於像string等物件賦值的是物件的屬性.
關於深拷貝和淺拷貝問題我沒有很透徹的理解, 相關問題請參考 深拷貝和淺拷貝.
java中的clone 方法詳解
test public void testassign test public void testshallowcopy throws exception如果是基本資料型別的成員變數,我們轉殖之後彼此的屬性是可以相互不影響的,接著看 如果增加乙個自定義的類物件時 data public class ...
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...