摘自Herbert关于Java的书的摘要
克隆是一种潜在的危险行为,因为它会产生意想不到的副作用。例如,如果被克隆的对象包含一个名为obRef的引用变量,那么当克隆完成时,克隆中的obRef将引用与原始对象中的obRef相同的对象。如果克隆对obRef所引用的对象的内容进行了更改,那么它也将对原始对象进行更改。
因此,当对象被克隆时,指向该原始对象的引用是否也会被克隆,因此这些指向克隆对象的指向?
我对这一行感到困惑:“克隆中的...obRef将引用与原始.中的obRef相同的对象”。
发布于 2014-10-18 10:21:53
考虑到对原始对象的引用与原始对象中的引用之间的区别。
假设您有一个myObj类型为MyClass的对象,其中包含一个名为myList的ArrayList类型的字段。
当您构造这个对象时,myList是用new ArrayList()初始化的,现在指向VM堆中的一个对象。
现在假设你克隆了myObj
MyClass myClone = myObj.clone();变量myClone指向与myObj不同的对象。它们是两个截然不同的物体。但是,myList字段在myObj中与myClone中的myList指向堆中的相同对象。这是因为当您克隆时,引用是按原样复制的,在新对象中没有new ArrayList()将单独的对象分配给myList。
任何引用都不会自动更改,所以对旧myObj的任何引用都会指向它。对新对象的唯一引用是myClone,直到将它赋值给其他变量为止。但myList也是如此。因此,这两个对象指向同一个ArrayList。因此,如果其中一个加入了它,另一个就会看到附加的价值。
通常情况下,这不是你需要的。
发布于 2014-10-18 10:34:21
让我们说,我有一个叫做另一个的类,如下所示:
public class Another {
int number;
String message;
// And so on.
}和另一个名为CloneMe重写克隆()方法的类,如下所示:
public class CloneMe {
int version;
Another another;
public CloneMe(int newVersion, Another obj) {
this.version = newVersion;
this.another = obj;
}
// and so on
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // You can also provide your own implementation here
}
}现在,当您创建类CloneMe的对象时:
CloneMe actualObject = new CloneMe(10, new Another());然后创建类的一个实例--另一个,并分配给您的CloneMe类中的另一个引用。
现在,当你打电话:
CloneMe clonedObject = actualObject.clone();然后,只使用CloneMe的现有状态创建一个新的actualObject实例。但是,没有创建任何其他类的新实例(例如,在本例中是另一个),但是将相同的对象引用分配给clonedObject中的引用变量。这被称为浅克隆。
https://stackoverflow.com/questions/26438552
复制相似问题