Java clone方法

21 、寫 clone()方法時,一般都有一行代碼,是什麼 ?
clone 有缺省行爲,
super.clone();
由於首先要把父類中的成員複製到位,而後纔是複製本身的成員。
java

1、關於new 和clone方法的區別

1 使用new操做符建立一個對象  函數

2 使用clone方法複製一個對象 
那麼這兩種方式有什麼相同和不一樣呢? new操做符的本意是分配內存。程序執行到new操做符時, 首先去看new操做符後面的類型,由於知道了類型,才能知道要分配多大的內存空間。分配完內存以後,再調用構造函數,填充對象的各個域,這一步叫作對象的初始化,構造方法返回後,一個對象建立完畢,能夠把他的引用(地址)發佈到外部,在外部就可使用這個引用操縱這個對象。spa

而clone在第一步是和new類似的, 都是分配內存,調用clone方法時,分配的內存和源對象(即調用clone方法的對象)相同,而後再使用原對象中對應的各個域,填充新對象的域, 填充完成以後,clone方法返回,一個新的相同的對象被建立,一樣能夠把這個新對象的引用發佈到外部。 code

在Java中,如下相似的代碼很是常見:對象

Person p = new Person(23, "zhang");
		Person p1 = p;
		
		System.out.println(p);
		System.out.println(p1);


當Person p1 = p;執行以後, 是建立了一個新的對象嗎? 首先看打印結果: com.pansoft.zhangjg.testclone.Person@2f9ee1ac
com.pansoft.zhangjg.testclone.Person@2f9ee1ac

可已看出,打印的地址值是相同的,既然地址都是相同的,那麼確定是同一個對象。p和p1只是引用而已,他們都指向了一個相同的對象Person(23, "zhang") 。 能夠把這種現象叫作引用的複製。 (關於引用和對象的區分,能夠參考我以前的文章Java中的String爲何是不可變的? -- String源碼分析 , 其中有一節講到了引用和對象的區分)。上面代碼執行完成以後, 內存中的情景以下圖所示:內存


而下面的代碼是真真正正的克隆了一個對象。get

Person p = new Person(23, "zhang");
		Person p1 = (Person) p.clone();
		
		System.out.println(p);
		System.out.println(p1);


另外,還要淺拷貝和深拷貝源碼

相關文章
相關標籤/搜索