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

java對象克隆

發布時間: 2023-03-27 06:55:44

A. java如何深度一個object

方法一:把對象序列化之後再反序列化,之後得到的對象就是深度克隆的對象;
方法二:自己重寫方法,不過有點麻煩。

B. java怎麼復制一個一樣的對象

可以使用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文檔

C. java怎麼樣構造函數復制一個對象

一、用Object 本身的復制對象的方法, clone()。對象可克隆的類必須實現Cloneable介面,並且clone方法是淺克隆。
二、類實現Serializable,用ObjectOutputStream、ObjectInputStream 來復制對象。

對象克隆有點復雜,尤其是第一種。
關於這個問題你可以搜索:
JAVA深復制(深克隆)與淺復制(淺克隆)
這篇文章看看。

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

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

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


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

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


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

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

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

E. 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關鍵字將其排除在復制過程中。

F. java,,"淺克隆,只復制一個對象 ,深克隆 對象和引用一起復制"有java實例嗎不理解啊

對只包含進本類型的類來說,無所謂深克隆。但是一個類包含集合類或者復雜的類,就要考慮二者的區別了。

class Student {
private int id;
private Address address;
private ArrayList<Book> bookList;
}
對於以上類的一個對象a和克隆類 o來說:
淺克隆:
a !=o 但是 a.address == o.address, a.bookList == o.bookList
深克隆:
a !=o 但是 a.address != o.address, a.bookList != o.bookList
並且 bookList中的每個元素不是相同對象。
簡言之, 淺克隆只復制本對象,深克隆除了本對象,其兒子、孫子、....都要克隆。
以上純手敲,有錯請包涵。

G. 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

}

}

H. Java中對對象克隆,一定要實現Cloneable介面嗎

是的。如果沒渣知有實現Cloneable介面,則調用Object的clone方法克隆對象將會拋出下面這個錯誤:
CloneNotSupportedException
- 如果對象的類不支持 Cloneable 介面,則重寫 clone
方法的子類也會拋出此異常,以指示無法復制某胡升個實例。褲梁老更多java技術請訪問bug315。

這是Object中clone方法的定義:
protected Object clone() throws CloneNotSupportedException

I. 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」。深到什麼程度為止?本文描述的目標是一直深到你想要的程度,包括深到不能再深的程度。

J. java中克隆一個對象對象的屬性改變另一個改變嗎

不改變。java中克隆一雀大伍個對象對象的屬性改變另一個不改變。屬於仿磨值傳遞,改變一個對象的值,另一頃或個不會受影響。

熱點內容
csgo如何連伺服器 發布:2024-11-03 02:13:04 瀏覽:391
斯坦福python 發布:2024-11-03 01:47:08 瀏覽:609
乘法編程教程 發布:2024-11-03 01:37:06 瀏覽:693
咒怨2ftp 發布:2024-11-03 01:31:17 瀏覽:432
linux如何安裝telnet 發布:2024-11-03 01:20:20 瀏覽:84
蘋果手機怎麼加密軟體 發布:2024-11-03 01:20:16 瀏覽:885
微信存儲路徑刪除 發布:2024-11-03 01:14:09 瀏覽:393
c語言貪吃蛇源碼 發布:2024-11-03 00:57:15 瀏覽:120
八碼演算法 發布:2024-11-03 00:56:31 瀏覽:975
python怎麼念 發布:2024-11-03 00:56:22 瀏覽:222