⑴ java clone方法 怎麼用
什麼是"clone"?
在實際編程過程中,我們常常要遇到這種情況:
有一個對象A,在某一時刻中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,並且此後對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。在 Java語言中,用簡單的賦值語句是不能滿足這種需求的。要滿足這種需求雖然有很多途徑,但實現clone()方法是其中最簡單,也是最高效的手段。
Java的所有類都默認繼承java.lang.Object類,在java.lang.Object類中有一個方法clone()。JDK API的說明文檔解釋這個方法將返回Object對象的一個拷貝。
要說明的有兩點:
一是拷貝對象返回的是一個新對象,而不是一個引用。
二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
怎樣應用clone()方法?
一個很典型的調用clone()代碼如下:
{
publicintaInt;
publicObjectclone(){
CloneClasso=null;
try{
o=(CloneClass)super.clone();
}catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returno;
}
}
有三個值得注意的地方,
一是希望能實現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異常。
⑵ 如何進行Java對象的克隆
以數組對象的克隆為例。
Java程序:
publicclassMain{
publicstaticvoidmain(String[]args){
int[]a={1,2,3};
int[]b=a.clone(); //b是a的克隆,a和b指向不同的數組
int[]c=a; //c是a的引用,a和c指向同一個數組
a[0]=10;
System.out.println("a[0]="+a[0]);
System.out.println("b[0]="+b[0]);
System.out.println("c[0]="+c[0]);
}
}
運行測試:
a[0]=10
b[0]=1
c[0]=10
自定義類的情況如下:
publicclassMain{
publicstaticvoidmain(String[]args){
Aa1=newA();
a1.name="Smith";
Aa2=a1;
Aa3=(A)a1.clone();
a1.name="White";
System.out.println("a1:"+a1.name);
System.out.println("a2:"+a2.name);
System.out.println("a3:"+a3.name);
}
}
classAimplementsCloneable{
publicStringname=null;
@Override
publicObjectclone(){
Aa=null;
try{
a=(A)super.clone();
}
catch(CloneNotSupportedExceptione){
e.printStackTrace();
}
returna;
}
}
運行測試:
a1:White
a2:White
a3:Smith
⑶ java淺拷貝的對象兩個內向相等嗎
兩個對象內向相等。
java對象默認繼承java。long。Object類,裡麵包含clone方法。JDKAPI的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象是一個新對象,而不是一個引用。二是拷貝對象與用new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。
java中的基本數據類型判斷是否相等,直接使用==就行了,相等返回true,否則,返回false。
⑷ java如何實現對象的克隆
可以重載clone方法克隆對象
首先、該類要實現Cloneable的介面,不然執行clone方法內的時候會拋出CloneNotSupportedException異常
然後容、就在該類重載clone方法,自己加上克隆的邏輯,本人小白,手敲的代碼
{
privateStringname;
publicBook(Stringname){
this.name=name;
}
@Override
publicBookclone(){
returnnewBook(this.name);
}
}
⑸ 在java中,如何復制一個對象比如說string對象
可以使用clone來實制現,clone用於為引用類型的復制
1.使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常
2、實現Cloneable介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
3、在Java.lang.Object類中克隆方法是這么定義的:
protected Object clone()
throws CloneNotSupportedException
創建並返回此對象的一個副本。表明是一個受保護的方法,同一個包中可見。
按照慣例,返回的對象應該通過調用 super.clone 獲得。
詳見關於clone的API文檔