java的clone
㈠ java中Object.clone方法的用途是什麼
clone方法是用來復制一個對象。不同於「=」。
對於值類型的數據是可以通過「=」來實現復制的。但是對於引用類型的對象,「=」只能復制其內存地址,使對象的引用指向同一個對象,而不會創建新的對象。clone則可以創建與原來對象相同的對象。舉個例子:
有一個Car類
Car c1 = new Car();
Car c2 = c1;
這兩句事實上只創建了一個對象。只不過c1和c2指向了同一個對象。
如果上面的兩句改為:
Car c1 = new Car();
Car c2 = c1.clone();
那麼就有了兩個對象,而且這兩個對象的內容是一樣的。(所有的屬性值相同)
同時,我想說的是一樓的使用,雖然程序本身沒有錯誤,但是用date.clone()添加到list當中,會再次創建date的對象,消耗內存資源,這是編程的忌諱。特別是編寫java程序,更要好好利用內存的有限資源,避免浪費。
㈡ java關於clone的問題
嗯,正常情況下,Object.clone()會正確返回一個當前對象的一個復本。
除非當前對象沒有實現java.lang.Cloneable。
你的程序直接運行沒有錯誤,無論在JDK1.3\1.4\1.5\1.6下都是正確的。
看了java的規范,理論上任何JDK都應該實現Object.clone()的。
那麼反過來考慮,如果要產生你那個NullPointerException,必須使clone()返回null,那麼只有兩種可能: Object.clone()返回null或者拋出異常。
進而推論為Account對象沒有實現 java.lang.Cloneable!
因此,我猜測在你程序的同一個目錄下,還有個Cloneable.java,定義了一個自定義的Cloneable,或者你給的這段程序少了下面一段:
interface Cloneable {
public Object clone();
}
我試了一下,如果有個自定義的Cloneable,那麼編譯器就不會認為Account類實現了java.lang.Cloneable,因此Object.clone()就會拋出異常了。
㈢ java代碼 clone()函數的作用是什麼
從樓主對回答的追問上發現,樓主的連JAVA基本的語法都很差啊。=號是賦值運算符,不是比較。
double[] vectorValue;
vectorValue = vectorValue.clone();
這個段代碼執行肯定報錯了。但他還的意思還是很明確的。
首先:double[] vectorValue; 這個是定義了一個double類型的數組變數vectorValue。
其次:vectorValue = vectorValue.clone(); //這個是將vectorValue 克隆一份,賦值給自己。也就是說vectorValue變數指向了新的一塊內存區域。
舉個例子可能更能說明問題。
{
privateinti;
publicTestMain(inti){
this.i=i;
}
@Override
protectedObjectclone(){
//TODOAuto-generatedmethodstub
returnnewTestMain(this.getI()+1);
}
publicintgetI(){
returni;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
TestMaintm1=newTestMain(1);
TestMaintm2=tm1;
tm1=(TestMain)tm1.clone();
System.out.println(tm1.getI());//tm1指向的是通過clone()方法創建的新的對象的地址,i的值已經是2了。
System.out.println(tm2.getI());//tm2指向的還是tm1創建時的地址,i的值為1
}
}
㈣ Java 中 如果clone為什麼必須實現Cloneable介面
因為如果不繼承自Cloneable介面,當調用clone()時會拋出CloneNotSupportedException異常
以下是詳細講解:
Java的所有類都默認繼承java.lang.Object類,在java.lang.Object類中有一個方法clone()。JDK API的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象返回的是一個新對象,而不是一個引用。二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
怎樣應用clone()方法?
一個很典型的調用clone()代碼如下:
class CloneClass implements Cloneable{
public int aInt;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
有三個值得注意的地方,一是希望能實現clone功能的CloneClass類實現了Cloneable介面,這個介面屬於java.lang 包,java.lang包已經被預設的導入類中,所以不需要寫成java.lang.Cloneable。另一個值得請注意的是重載了clone()方 法。最後在clone()方法中調用了super.clone(),這也意味著無論clone類的繼承結構是什麼樣的,super.clone()直接或 間接調用了java.lang.Object類的clone()方法。下面再詳細的解釋一下這幾點。
應該說第三點是最重要的,仔細 觀察一下Object類的clone()一個native方法,native方法的效率一般來說都是遠高於java中的非native方法。這也解釋了為 什麼要用Object中clone()方法而不是先new一個類,然後把原始對象中的信息賦到新對象中,雖然這也實現了clone功能。對於第二點,也要 觀察Object類中的clone()還是一個protected屬性的方法。這也意味著如果要應用clone()方法,必須繼承Object類,在 Java中所有的類是預設繼承Object類的,也就不用關心這點了。然後重載clone()方法。還有一點要考慮的是為了讓其它類能調用這個clone 類的clone()方法,重載之後要把clone()方法的屬性設置為public。
那麼clone類為什麼還要實現 Cloneable介面呢?稍微注意一下,Cloneable介面是不包含任何方法的!其實這個介面僅僅是一個標志,而且這個標志也僅僅是針對 Object類中clone()方法的,如果clone類沒有實現Cloneable介面,並調用了Object的clone()方法(也就是調用了 super.Clone()方法),那麼Object的clone()方法就會拋出CloneNotSupportedException異常。