小编典典

为什么Object类的clone()方法提供对象的深层副本?

java

根据JAVA文档,当调用super.clone()时,将返回对象的浅表副本。在下面的代码中,我有两个对象 nameid
;和一个基本变量 num
。当在第一个对象上调用super.clone()方法时,除了预期的num副本外,它似乎还在创建对象的深层副本(名称和ID)。克隆对象obj之后,我更改了它的名称和id字段。如果正在制作浅表副本,则这些更改应反映在克隆的对象中。我对吗?

public class Cloning implements Cloneable {
String name;
int num;
Integer id;
Cloning(String name,int num,Integer id)
{
    this.name = name;
    this.num = num;
    this.id = id;
}
public Object clone()
{
    try
    {
        return super.clone();
    }
    catch(CloneNotSupportedException E)
    {
        System.out.println(E.getMessage());
        return null;
    }
}
public void print()
{
    System.out.println(name);
    System.out.println(num);
    System.out.println(id);
}


public static void main(String[] args) {
    // TODO Auto-generated method stub
    Cloning obj = new Cloning("Annu",203,new Integer(3));
    Cloning obj1 = (Cloning)obj.clone();
    obj.name = "Annu_modified";
    obj.num = 204;
    obj.id = new Integer(4);
    obj.print();
    obj1.print();


 }
}

我在运行代码时得到以下输出:

Annu_modified

204

4

安努

203

3


阅读 225

收藏
2020-11-26

共1个答案

小编典典

让我们看一下示例中的一部分:obj.id = new Integer(4);。在这里,您无需更改id的内部表示,而是将新实例分配给id引用。这两个IntegerString是不可变的,所以很难感受到浅VS与他们深拷贝的差异。尝试添加例如ArrayList属性,并且为了对其进行修改,您可以例如添加新元素obj.myList.add(13);

2020-11-26