前言:
clone就是復制, 在Java語言中, clone方法被對象調用,所以會復制對象。所謂的復制對象,首先要分配一個和源對象同樣大小的空間,在這個空間中創建一個新的對象。那么在java語言中,有:
1 使用new操作符創建一個對象
2 使用clone方法復制一個對象
那么這兩種方式有什么相同和不同呢? new操作符的本意是分配內存。程序執行到new操作符時, 首先去看new操作符后面的類型,因為知道了類型,才能知道要分配多大的內存空間。分配完內存之后,再調用構造函數,填充對象的各個域,這一步叫做對象的初始化,構造方法返回后,一個對象創建完畢,可以把他的引用(地址)發布到外部,在外部就可以使用這個引用操縱這個對象。而clone在第一步是和new相似的, 都是分配內存,調用clone方法時,分配的內存和源對象(即調用clone方法的對象)相同,然后再使用原對象中對應的各個域,填充新對象的域, 填充完成之后,clone方法返回,一個新的相同的對象被創建,同樣可以把這個新對象的引用發布到外部。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package test; public class Cloneoo { public static void main(String[] args) { test t= new test(); t.changeInt(); System.out.println(t); try { test t1=(test) t.clone(); //創建 System.out.println(t1); System.out.println(t1.getI()); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class test implements Cloneable{ private int i= 0 ; public void setI( int i) { this .i = i; } public int getI() { return i; } public void changeInt(){ this .i= 1 ; } @Override protected Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub test t= null ; t=(test) super .clone(); return t; } } |
1
2
3
|
test.test @15db9742 test.test @6d06d69c 1 |
當類中包含一些對象的時候,我們就需要深復制,就是在對對象的復制之后,急著對對象中的非基本類型的屬性也調用clone方法完成深復制。
clone方法執行的是淺拷貝
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qq442270636/article/details/74009452