欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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方法。

相关标签: 经验