當前位置:首頁 » 編程語言 » java克隆

java克隆

發布時間: 2022-05-03 16:45:02

A. javaSE問題java對象克隆的優點

克隆是另一個作用,比如,你要傳遞給另一個對象的某個方法method的參數中包含A對象,但是,你不知道這個方法是不是對你的A進行了修改,而你又不想他修改,或者說他修改了也不會對你有任何影響,你就可以使用克隆來完成這個任務。這樣即使他修改了,也只是對你的克隆對象的修改,而沒有對你的那個對象本身進行修改。

克隆還有一個作用,對於數據bean,如果你有beanA,想快速創建一個類似的beanB,而只是其中的一兩個屬性不一樣,就可以使用克隆來完成了。

克隆還需要注意深度克隆的問題,舉個例子:
你的對象A中包含了對象B,對象A實現了克隆,對象B沒有實現克隆,如果你在對A進行克隆的時候,克隆成對象A2,則A2中也包含對象B,而且,這兩個引用是一樣的,如果你修改A對象中的B對象的某個值,也會修改到A2對象中的B對象的對應屬性的值。

B. java對象克隆

修改後的代碼:

classBook1implementsCloneable{
privateStringtitle;
privatedoubleprice;
publicBook1(Stringtitle,doubleprice){
this.title=title;
this.price=price;
}
publicvoidsetPrice(doubleprice){
this.price=price;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicdoublegetPrice(){
returnprice;
}
publicStringgetTitle(){
returntitle;
}
protectedObjectclone(){
returnsuper.clone();
}
publicStringtoString(){
return"BOOK[title="+title+",price="+price+"]";
}
}
publicclassX{
publicstaticvoidmain(Stringargs[]){
Book1bookA=newBook1("JAVA從入門到精通",79.8);
Book1bookB;
try{ //加一個異常處理
bookB=(Book1)bookA.clone();
bookB.setPrice(100.8);
System.out.println(bookA);
System.out.println(bookB);
}catch(Exceptione){
}
}
}

C. java中的淺克隆和深克隆是什麼

淺克隆:僅僅復制所克隆的對象,而不復制它所引用的對象。

被復制對象的所有變數都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。


深克隆:把要復制的對象所引用的對象都復制了一遍。

那些引用其他對象的變數將指向被復制過的新對象,而不再是原有的那些被引用的對象。


很明顯二者時間消耗有差距,在不影響的情況下盡量用淺克隆

注意區分與C語言的淺克隆深克隆 那個是引用地址與重新分配地址構建的區別,詳細可以參見:

http://www.cnblogs.com/yxnchinahlj/archive/2010/09/20/1831615.html

D. Java中是如何實現克隆

java 實現clone對象方法的步驟如下:
(1)實現Cloneable介面
(2)重載Object類中的clone()方法,重載時需定義為public
(3)在重載方法中,調用super.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;
}

E. 如何克隆Java對象

Java中的對象涉及使用引用類型,沒有直接的方法可將一個對象的內容復制到一個新對象中。將一個引用分配給另一個引用只會給相同對象建立另一個引用。因此,Java對所有引用類型使用一個特殊的clone()方法,為對象復制自身提供一個標準的機制。以下是你需要了解和克隆Java對象有關的細節。為何建立一個本地拷貝?給一個對象建立本地拷貝的原因很可能是由於你計劃修改該對象,並且你不想修改方法調用者的對象。如果你確定你需要一個本地拷貝,你可以使用Object類的clone()方法來執行這項操作。clone()方法被定義為受保護方法,但你必須在你希望克隆的所有子類中重新公開定義它。例如,標准庫類ArrayList忽略clone(),但你可以這樣為ArrayList調用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1』s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一個Object,它必須重新轉變為適當的類型。這個例子說明ArrayList的clone()方法如何不能自動克隆ArrayList包含的每一個對象?原有ArrayList和克隆後的ArrayList是相同對象的別名。這種情況通常叫做淺拷貝,因為它僅僅復制一個對象的「表面」部分。實際的對象由這個「表面」,引用指向的所有對象,以及那些對象指向的所有對象等構成。這往往被稱作「對象網路」。下一頁>>

F. java中的克隆技術具體有什麼應用

Clone基本知識儲備
在Java里提到clone技術,就不能不提java.lang.Cloneable介面和含有clone方法的Object類。所有具有clone功能的類都有一個特性,那就是它直接或間接地實現了Cloneable介面。否則,我們在嘗試調用clone()方法時,將會觸發CloneNotSupportedException異常。 下面我們通過對Object類的部分源碼的分析,來發現和理解這一特性。
l clone的實現

1.實現Cloneable介面

通過上一篇的介紹,我們知道,一個類若要具備clone功能,就必須實現Cloneable介面。做到這一步,clone功能已經基本實現了。Clone功能對我們來說,最主要的還是要能夠使用它。那麼我們如何才能使用clone功能呢?答案是覆蓋Object#clone()方法。

2. 覆蓋Object#clone()方法

為什麼需要覆蓋Object#clone()方法?這里得再次從jdk源碼說起。JDK中Object# clone()方法的原型是:

protected native Object clone() throws CloneNotSupportedException;

是否注意到,這里clone()方法修飾符是protected,而不是public。這種訪問的不可見性使得我們對Object#clone()方法不可見。相信讀者已明白為什麼要覆蓋Object#clone()方法。而且,覆蓋的方法的修飾符必須是public,如果還保留為protected,覆蓋將變得沒有實際意義。下面舉一個具有clone功能的簡單的例子:

/*

* 具有clone功能的類的例子

*/

public class CloneableObjExample implements Cloneable {

//……部分代碼已省略……

private String name = null;

private int score = 0;

/**

* NOTE: 將protected 修飾符 更改為 public

* @see java.lang.Object#clone()

*/

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父類的clone方法

Object result = super.clone();

//TODO: 定製clone數據

return result;

}

}

3.定製clone

至此,clone已經真相大白。Clone的對象我們可以對其進行定製。還就上面的例子來說。下面的方法對功能做了一定的增強:

public/*protected*/ Object clone() throws CloneNotSupportedException {

// call父類的clone方法

CloneableObjExample result = (CloneableObjExample)super.clone();

//TODO: 定製clone數據

//雖然」clone」了,但還可以做點調整

result.name = 「New Name」;

result.score = 90;

return result;

}

本篇介紹了如何實現clone。接下來的篇幅將就縱深clone等clone的高級特性進行分析。

本章將進入clone的高級特性,著重講述縱深clone技術。

Clone通常有兩種類型即淺clone和深clone。首先,分析一下兩種的不同。淺clone和深clone都是clone,它們本質區別是對象內部的成員屬性(非原生類型屬性,如int等)在clone時是否處理為引用。如果仍然保留為引用,則稱為淺clone,反之稱為深clone。其實這兩個概念也是相對的概念。在處理上它們有點區別,淺clone方式得到clone對象即可,深clone方式在得到clone對象後,還需要對引用的成員屬性進行「clone」處理。從這個層次上說,深clone並沒有什麼特別地困難,簡單講就是創建好對象,再設置一些成員屬性。關於深clone,網上的文章已經有太多,有點目不暇接的感覺,本文不再贅述,這也不是本文的重點。

本文的重點是要闡述縱深clone,亦即「N深clone」。深到什麼程度為止?本文描述的目標是一直深到你想要的程度,包括深到不能再深的程度。

G. 關於java克隆對象

--在使用clone方法時,對於每一個類,都需要做如下判斷:
1--默認的clone方法是否能滿足要求
2--默認的clone方法是否能通過調用可變子對象的clone方法修補
3--是否不應該使用clone
----如選擇1和2,就必須實現Cloneable介面,使用public重定義clone方法
意思就是,你如果想用clone方法,首先要考慮Object的clone能不能滿足你的需求,如果可以,那好,直接調用,反之,你就得必須在需要使用clone方法的類中實現Cloneable介面,自己寫一個Clone規則。

H. java中深克隆與淺克隆的區別

深克隆與淺克隆

大家知道,對象是互相引用的,即對象中可能包含了另一個對象的引用,舉例如:有一個Order對象,Order對象中又包含了LineItems對象,然後LineItems對象又包含了Item對象。

好了,現在我有一個Order對象order1,它包含了一個LineItems對象items,這表示的是有一個訂單order1,訂單的內容是items。

好的,現在有另一個客戶想要一份訂單,內容跟order1完全一樣,那麼在系統的邏輯層我們怎麼做呢?很簡單,order2=order1.clone(). 我們知道clone方法是在內存中生成一個新的對象,而不是只得到原對象的引用。這時候,有人說話了:「哦,明白了我們對order2的成員變數進行修改,是不會影響order1的。」 很可惜,這句話只對了一半。

假設order類有一個成員變數name,當然改變order2.name不會影響order1.name,因為他們在不同的內存區域。但是如果改變 order1.items呢?很遺憾,簡單地使用order1.clone,是會影響到order2.items的。原因很簡單,就是因為clone方法默認的是淺克隆,即不會克隆對象引用的對象,而只是簡單地復制這個引用。所以在上例中,items對象在內存中只有一個,order1和order2都指向它,任何一個對象對它的修改都會影響另一個對象。

那相對淺克隆,深克隆自然就是會克隆對象引用的對象了。也就是說,在上例中,改變order1.items並不會影響order2.items了。因為內存中有兩個一樣的items。

如果實現深克隆?

一個方法自然是重寫clone方法,添加如order.items=(LineItems)items.clone()的語句,也就是人為地添加對引用對象的復制。這個方法的缺點是如果引用對象有很多,或者說引用套引用很多重,那麼太麻煩了。業界常用的方法是使用串列化然後反串列化的方法來實現深克隆。由於串列化後,對象寫到流中,所有引用的對象都包含進來了,所以反串列化後,對等於生成了一個完全克隆的對象。絕!

這個方法的要求是對象(包括被引用對象)必須事先了Serializable介面,否則就要用transient關鍵字將其排除在復制過程中。

I. java clone()

這是Object對象的clone克隆/復制方法作用是執行後將復制一份當前對象,並返回。

使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常

所以 Employee必須 implements Cloneable
又由於clone方法是Object就具有的,所以可以直接返回return (Employee)this.clone();

熱點內容
php開發的網頁 發布:2025-05-14 16:22:03 瀏覽:477
伺服器內存跑滿了怎麼回事 發布:2025-05-14 16:21:16 瀏覽:223
微信qq音樂緩存 發布:2025-05-14 16:16:16 瀏覽:468
c語言回收內存 發布:2025-05-14 16:16:08 瀏覽:143
2021國產安卓頂級旗艦買哪個 發布:2025-05-14 16:15:36 瀏覽:300
linux自學視頻 發布:2025-05-14 16:14:49 瀏覽:255
我的世界伺服器崩了重啟 發布:2025-05-14 16:09:37 瀏覽:44
android深拷貝 發布:2025-05-14 16:09:35 瀏覽:153
cf電腦版轉伺服器神器還在嗎 發布:2025-05-14 16:09:02 瀏覽:211
百度文庫伺服器如何搭建 發布:2025-05-14 16:09:00 瀏覽:248