java 克隆

时间:2023-03-09 16:09:23
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; } }