Java Object类的clone方法浅拷贝问题
程序员文章站
2022-03-03 10:36:47
...
先看下列代码:
import java.util.ArrayList;
public class Test21 implements Cloneable{
ArrayList<Integer> arrayList=new ArrayList<>();
public void setArrayList(int arg) {
try {
this.arrayList.add(arg);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
public static void main(String[] a) throws CloneNotSupportedException {
Test21 test1=new Test21();
try {
test1.setArrayList(10);
}catch (NullPointerException e){}
Test21 test2=(Test21)test1.clone();
test2.arrayList.add(2);
System.out.println(test1.arrayList.get(1));
}
}
程序的输出结果是2。这样应该就对clone方法的浅拷贝概念有一定的认识了。clone方法在复制对象的成员变量时,是简单的复制,这对于基本数据类型或String类型无所谓(我也不知道String类型为什么可以,但结果是可以),但对于引用数据类型,比如上面代码的Arraylist对象,clone后的副本与原本共享这一属性,导致了test2的属性改变时,test1的属性也跟着改变,换句话说,这两个属性指向的是同一个引用,同一个地址。
所以在自定义类中有复制需求的,最好重写并覆盖clone方法,而不是直接使用Object类的clone方法。在使用API时最好也看一下源码的有没有重写clone方法。
下一篇: 110 平衡二叉树
推荐阅读
-
深入浅出Java中的clone克隆方法,写得太棒了!
-
Java中的Object类的几个方法
-
荐 java父类-Object类-equals与==-方法的重载和重写-游离块-this关键字
-
java开发中object类中的hashcode()方法使用
-
Java:object类 中常用equals()和 toString()方法的重写
-
java中的浅拷贝和深拷贝 java浅拷贝深拷贝clone克隆
-
Java的深拷贝和浅拷贝--clone()方法(二)
-
java中Object类的方法之toString 、equals
-
Java中的clone方法-理解浅拷贝和深拷贝
-
Java如何重写object类的equals方法详解