java中如何實現一個類的深克隆的代碼

類的屬性如果是引用類型的 那麼繼續執行屬性的 clone方法即可(屬性要實現Cloneable介面)

❷ java的深復制和淺復制

java中有一抄個對象池,當執行A a1 = new A()時,會在對象池中生成一個A的對象,並把這個對象的引用給a1;
淺拷貝就是如A a2 = a1,這時候對象池中只有一個A對象,只不過這個對象多了個a2的引用,此時a1和a2指向的是同一個對象;
深拷貝就是在對象池中再生成一個A對象給a2,這個A對象跟a1指向的A對象內容、引用等都一樣,但此時a1和a2指向的是不同的兩個對象。

❸ java如何深度一個object

java深復制的例子:
1、創建Employer類,實現Cloneable介面:
class Employer implements Cloneable{
private String username;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

2、創建Employee類,實現Cloneable介面,並改寫clone方法,實現深復制:
class Employee implements Cloneable{
private String username;
private Employer employer;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}

@Override
public Object clone() throws CloneNotSupportedException {
//克隆Employee對象並手動的進一步克隆Employee對象中包含的Employer對象
Employee employee = (Employee)super.clone();
employee.setEmployer((Employer) employee.getEmployer().clone());
return employee;
}
}

3、這樣,在客戶端拷貝的兩個Employee對象的Employer就互不影響了:
public static void main(String[] args) throws CloneNotSupportedException {
Employer employer = new Employer();
employer.setUsername("arthinking");

Employee employee = new Employee();
employee.setUsername("Jason");
employee.setEmployer(employer);

//employee2由employee深復製得到
Employee employee2 = (Employee) employee.clone();
//這樣兩個employee各自保存了兩個employer
employee2.getEmployer().setUsername("Jason");
System.out.println(employee.getEmployer().getUsername());
System.out.println(employee2.getEmployer().getUsername());
}

❹ Java中的淺克隆與深克隆 ,有可以區別開的實例嗎求大神指點

淺克隆 就是只克隆類的屬性,子對象的屬性就不管了。

深克隆,就當前類屬性、子對象、子子對象屬性、、、、、、全克隆了

❺ JAVA如何實現深拷貝

下面給你簡單介紹protected 域(或方法)實現過程思路:

protected 域(或方法)對本包內的所有類可見(當然包括子類),那麼,子類可以獲得訪超類受保護域(或方法)的權利,但是,若子類和超類不在同一個包下,就不能訪問超類對象的這個受保護域(或方法)。

淺拷貝與深拷貝

Object類對自己的具體子類的域一無所知,Object類的clone方法只是將各個域進行拷貝。數值或基本類型不會出現問題,但是,如果在對象中包含了引用對象,這些對象的內容沒有被自我復制,拷貝的結果也即是原始對象和拷貝對象引用著同一個引用對象(一般地,動詞「引用」可理解為「管理」,就是指向同一內存)。

淺拷貝滿足:

x.clone() != x為 true,

x.clone().getClass() == x.getClass()為true,

((x.clone().field1 ) == (x. field1))&& … &&((x.clone().fieldN )==(x. fieldN))也為 true 。

如果原始對象與淺拷貝對象共同引用(管理、指向)的引用對象是不可變的,將不會產生任何問題

如果原始對象管理的引用對象是可變的,就必須需重新定義clone方法,來實現深層次的拷貝。要對涉及的每一個類,判斷以下兩點:

默認的clone方法是否滿足需求。

默認的clone方法是否能通過調用可變引用對象的clone方法得到解決。

對涉及的每一個類,深拷貝要滿足:

x.clone() != x為 true,

x.clone().getClass() == x.getClass()為true,

x.clone().equals(x)也為 true ,當然equals方法是如此重寫過的。

Object類中的clone方法被聲明為protected,防止出現文章開頭所提到的,子類和超類不在同一個包下的情況,要聲明clone為public,來實現深拷貝

❻ java中的淺克隆和深克隆是什麼

克隆是指克隆對象,在堆空間復制一塊內存,是完全的兩個對象,不是指針指向!淺克隆是指克隆一個對象,而該對象的屬性只是基本數據類型,只克隆出該對象!深度克隆是指克隆的目標裡面還有引用類型,引用類型里還有引用類型,同時把引用類型克隆出來叫深度克隆!常用的方法有兩種,第一,需克隆的對象實現cloneable介面;第二,使用commons包提供的克隆方法。這兩種方法都能實現深度克隆!

❼ java深克隆

deep ,自己看:
http://blog.csdn.net/liuchao1211/article/details/3277955

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

❾ 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中的每個元素不是相同對象。
簡言之, 淺克隆只復制本對象,深克隆除了本對象,其兒子、孫子、....都要克隆。
以上純手敲,有錯請包涵。

❿ 淺復制和深復制的區別 java

淺復制和深復制的區別 java
大體上來說,深拷貝與淺拷貝的區別主要還是在於指針(或與指針)方面,淺拷貝只是簡單的把源對象(這個是指廣義的對象,不僅僅單指類的實例)的指針賦值給目標對象,對目標指針的操作就是對源對象的操作,所以在很多情況下,目標對象析構(或跳出其可見域)之後,源對象相關部分也就一同析構了。而深拷貝,是為目標對象重新分配空間,這樣可以與源對象的操作分開。