Java中的clone方法

2021-08-21 17:37:08 字數 2651 閱讀 9064

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...