Java的clone()用法例項解析

李博Garvin發表於2015-02-03

1.背景

         用java寫程式的時候很苦惱的一件事就是,如果將一個物件a賦給另一個物件b,那麼你改變a的變數值得時候,b的值也對應的變化。如果我們只想單純的獲取那個時刻的a的狀況給b的話,就要用到clone方法了。

比如說如下程式碼:

public class Main {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
      
       Node n=new Node();
       Node n1=n;
      
       n.a=5;
     
       System.out.print(""+n1.a);
		
	}

}
public class Node {
    int a=1;
    
}

輸出結果是5,

下面就利用clone實現如上情況輸出結果是1.


2.程式碼

克隆的實現需要一下幾步:

在派生類中覆蓋基類的clone()方法,並宣告為public。

在派生類的clone()方法中,呼叫super.clone()。

在派生類中實現Cloneable介面。Cloneable介面沒有任何抽象的方法,這樣的成為標識介面。實現這個介面,只是為了告訴編譯器這個物件可以被克隆了。

首先我們在派生類中覆蓋了Object類的Clone()方法,並宣告為public的。然後我們呼叫了super.clone()方法,這裡會丟擲一個異常(對於這個異常大家可以自己檢視java的幫助文件),所以必須用try……catch……語句捕獲,然後返回此物件。這裡需要說明一下,Clone()方法返回的是Object型別的,所以需要強制型別轉換

public class Main {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
      
       Node n=new Node();
       Node n1=(Node)n.clone();
      
       n.a=5;
     
       System.out.print(""+n1.a);
		
	}

}
public class Node implements Cloneable{
    int a=1;
    public Object clone(){
      	Node n=null;
    	    try{
    	    	  n=(Node)super.clone();
    	    }
    	    catch(Exception e ){
    	    	e.printStackTrace();
    	    }
       return n;
    }
}

輸出結果是1;


ps:補充一道題

15. 不通過建構函式也能建立物件嗎()

A 是     B 否

答案:A

解析:Java建立物件的幾種方式(重要):

(1) 用new語句建立物件,這是最常見的建立物件的方法。
(2) 運用反射手段,呼叫java.lang.Class或者java.lang.reflect.Constructor類的newInstance()例項方法。
(3) 呼叫物件的clone()方法。
(4) 運用反序列化手段,呼叫java.io.ObjectInputStream物件的 readObject()方法。

(1)和(2)都會明確的顯式的呼叫建構函式 ;(3)是在記憶體上對已有物件的影印,所以不會呼叫建構函式 ;(4)是從檔案中還原類的物件,也不會呼叫建構函式。



引用:【1】http://blog.csdn.net/mengxiangyue/article/details/6818611
           【2】http://blog.csdn.net/lanxuezaipiao/article/details/16753743

/********************************

* 本文來自部落格  “李博Garvin“

* 轉載請標明出處:http://blog.csdn.net/buptgshengod

******************************************/

         

相關文章