这里主要说说实现深拷贝的两种方式:
1、浅拷贝
对于基本数据类型拷贝数值,对于引用数据类型拷贝引用。下面直接看代码实现:
public class CloneImp {public static void main(String[] args) {
Dog dog = new Dog();
dog.cat.name = "旺旺";
try {
Dog cloneDog = (Dog) dog.clone();
//拷贝数据变更
cloneDog.arr[1] = 3;
cloneDog.cat.name = "柯基";
cloneDog.account = 2000;
// 输出原始数据
System.out.println(dog);
System.out.println(cloneDog);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
class Dog implements Cloneable{ // 1. 实现Cloneable接口
//基本数据类型
int account = 1000;
//基本数据类型的数组
int[] arr = new int[] {1,2,3,4};
//引用数据类型
Cat cat = new Cat();
public Dog() {}
//2. 重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
//基本数据类型拷贝
Dog obj = (Dog)super.clone();
//基本数据类型对应的数组
int[] temp = new int[arr.length];
System.arraycopy(arr, 0, temp, 0, arr.length);
obj.arr = temp;
//应用数据类型
obj.cat = (Cat) cat.clone();
return obj;
}
public String toString() {
StringBuilder strb = new StringBuilder();
strb.append("account = " + account + "\n");
strb.append("cat name = " + cat.name + "\n");
strb.append("arr:");
for(int i : arr)
strb.append(i + "->");
strb.append("\n");
return strb.toString();
}
}
class Cat implements Cloneable{
public String name;
public Cat() {}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
};
}
输出:
account = 1000
cat name = 旺旺
arr:1->2->3->4->
account = 2000
cat name = 柯基
arr:1->3->3->4->
基本数据类型数据:值拷贝
引用数据类型数据:引用拷贝
深拷贝:
1、对于引用数据类型可以让成员对象实现cloneable接口
2、直接利用Serializable实现
public class CloneImp {
public static void main(String[] args) {
DeepCopyExample dce = new DeepCopyExample();
dce.cat.name = "旺旺";
DeepCopyExample cloneDog = (DeepCopyExample) dce.copy();
//拷贝数据变更
cloneDog.arr[1] = 3;
cloneDog.cat.name = "柯基";
cloneDog.account = 2000;
// 输出原始数据
System.out.println(dce);
System.out.println(cloneDog);
}
}
class DeepCopyExample implements Serializable{
//自动生成的serialVersionUID
private static final long serialVersionUID = 1111L;
int account = 1000;
int[] arr = {1,2,3,4};
Cat cat = new Cat();
//自定义copy方法
public DeepCopyExample copy() {
DeepCopyExample dce = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
dce = (DeepCopyExample)ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return dce;
}
@Override
public String toString() {
StringBuilder strb = new StringBuilder();
strb.append("account = " + account + "\n");
strb.append("cat name = " + cat.name + "\n");
strb.append("arr:");
for(int i : arr)
strb.append(i + "->");
strb.append("\n");
return strb.toString();
}
class Cat implements Cloneable, Serializable{
private static final long serialVersionUID = 2222L;
public String name;
public Cat() {}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
};
}
输出结果:
account = 1000
cat name = 旺旺
arr:1->2->3->4->
account = 2000
cat name = 柯基
arr:1->3->3->4->