根据JAVA文档,当调用super.clone()时,将返回对象的浅表副本。在下面的代码中,我有两个对象 name 和 id ;和一个基本变量 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
让我们看一下示例中的一部分:obj.id = new Integer(4);。在这里,您无需更改id的内部表示,而是将新实例分配给id引用。这两个Integer和String是不可变的,所以很难感受到浅VS与他们深拷贝的差异。尝试添加例如ArrayList属性,并且为了对其进行修改,您可以例如添加新元素obj.myList.add(13);
obj.id = new Integer(4);
Integer
String
ArrayList
obj.myList.add(13);