1. About Java中, 對於基本數據類型可以使用"=" 來克隆,此時兩個對象除了相等是沒有任何關係的; 而對於引用類型, 卻不能簡單地使用"="來克隆,這與java記憶體空間使用有關。 java將記憶體空間分為兩塊, 即堆和棧。 在棧中保存基本類型和引用變數,在堆中保存對象。 對於引用變數而言, ...
1. About
Java中, 對於基本數據類型可以使用"=" 來克隆,此時兩個對象除了相等是沒有任何關係的;
而對於引用類型, 卻不能簡單地使用"="來克隆,這與java記憶體空間使用有關。
java將記憶體空間分為兩塊, 即堆和棧。
在棧中保存基本類型和引用變數,在堆中保存對象。
對於引用變數而言,使用"="將修改引用, 而不是賦值堆中的對象,此時兩個引用變數將指向同一個對象。
因此,修改一個引用變數將改變另一個引用變數。
2. 淺克隆
如果對象的成員變數都是基本類型, 可以實現淺克隆完成。
對象實現Cloneable介面, 並覆寫clone()方法
public class A implements Cloneable{ //............. public A clone(){ A a = null; try{ a = (A)super.clone(); }catch(CloneNotSupportedException e { //...... } return a; } }
3. 深克隆
如果對象中包含引用類型變數,需要深克隆
即對象本身實現Cloneable,覆寫clone()方法;同時可變成員變數也實現Cloneable, 並覆寫clone()
public class A implements Cloneable{ private C c; //get set //............. public A clone(){ A a = null; try{ a = (A)super.clone(); a.c = c.clone(); }catch(CloneNotSupportedException e { //...... } return a; } } public class C implements Cloneable{ //............. public C clone(){ C c = null; try{ c = (C)super.clone(); }catch(CloneNotSupportedException e { //...... } return c; } }