1.拷贝:clone方法
拷贝就是复制一个java对象,在Object中定义了clone方法,不过其声明是protected,一个类如果不显示的重写它,其他类是无法调用clone方法的。并且即使一个类重写了clone方法,没有实现Cloneable接口,那么调用该类的clone方法也会抛出CloneNotSupportException异常
2.浅拷贝
拷贝的只是原来对象的引用
public class ShallowCloneExample implements Cloneable {
private int[] arr;
public ShallowCloneExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
@Override
protected ShallowCloneExample clone() throws CloneNotSupportedException {
// 只返回一个原对象的引用
return (ShallowCloneExample) super.clone();
}
}
// 执行代码
ShallowCloneExample e1 = new ShallowCloneExample();
ShallowCloneExample e2 = null;
try {
e2 = e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 原对象中修改数据,克隆对象中的数据也跟着修改
e1.set(2, 222);
System.out.println(e2.get(2)); // 222
3.深拷贝
public class DeepCloneExample implements Cloneable {
private int[] arr;
public DeepCloneExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
@Override
protected DeepCloneExample clone() throws CloneNotSupportedException {
// 将克隆对象修改数据后再返回
DeepCloneExample result = (DeepCloneExample) super.clone();
result.arr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
result.arr[i] = arr[i];
}
return result;
}
}
// 执行代码
DeepCloneExample e1 = new DeepCloneExample();
DeepCloneExample e2 = null;
try {
e2 = e1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 原对象中修改数据,克隆对象中的数据不会修改
e1.set(2, 222);
System.out.println(e2.get(2)); // 2
4.拷贝构造函数
使用 clone() 方法来拷贝一个对象即复杂又有风险,它会抛出异常,并且还需要类型转换。
public class CloneConstructorExample {
private int[] arr;
public CloneConstructorExample() {
arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public CloneConstructorExample(CloneConstructorExample original) {
arr = new int[original.arr.length];
for (int i = 0; i < original.arr.length; i++) {
arr[i] = original.arr[i];
}
}
public void set(int index, int value) {
arr[index] = value;
}
public int get(int index) {
return arr[index];
}
}
// 执行代码
CloneConstructorExample e1 = new CloneConstructorExample();
CloneConstructorExample e2 = new CloneConstructorExample(e1);
e1.set(2, 222);
System.out.println(e2.get(2)); // 2
原文链接
https://pdai.tech/md/java/basic/java-basic-lan-basic.html#clone