首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的对象克隆

Java中的对象克隆
EN

Stack Overflow用户
提问于 2014-10-18 10:06:07
回答 2查看 227关注 0票数 1

摘自Herbert关于Java的书的摘要

克隆是一种潜在的危险行为,因为它会产生意想不到的副作用。例如,如果被克隆的对象包含一个名为obRef的引用变量,那么当克隆完成时,克隆中的obRef将引用与原始对象中的obRef相同的对象。如果克隆对obRef所引用的对象的内容进行了更改,那么它也将对原始对象进行更改。

因此,当对象被克隆时,指向该原始对象的引用是否也会被克隆,因此这些指向克隆对象的指向?

我对这一行感到困惑:“克隆中的...obRef将引用与原始.中的obRef相同的对象”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-18 10:21:53

考虑到对原始对象的引用与原始对象中的引用之间的区别。

假设您有一个myObj类型为MyClass的对象,其中包含一个名为myList的ArrayList类型的字段。

当您构造这个对象时,myList是用new ArrayList()初始化的,现在指向VM堆中的一个对象。

现在假设你克隆了myObj

代码语言:javascript
复制
MyClass myClone = myObj.clone();

变量myClone指向与myObj不同的对象。它们是两个截然不同的物体。但是,myList字段在myObj中与myClone中的myList指向堆中的相同对象。这是因为当您克隆时,引用是按原样复制的,在新对象中没有new ArrayList()将单独的对象分配给myList

任何引用都不会自动更改,所以对旧myObj的任何引用都会指向它。对新对象的唯一引用是myClone,直到将它赋值给其他变量为止。但myList也是如此。因此,这两个对象指向同一个ArrayList。因此,如果其中一个加入了它,另一个就会看到附加的价值。

通常情况下,这不是你需要的。

票数 2
EN

Stack Overflow用户

发布于 2014-10-18 10:34:21

让我们说,我有一个叫做另一个的类,如下所示:

代码语言:javascript
复制
public class Another {
     int number;
     String message;
     // And so on.
}

和另一个名为CloneMe重写克隆()方法的类,如下所示:

代码语言:javascript
复制
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的对象时:

代码语言:javascript
复制
  CloneMe actualObject = new CloneMe(10, new Another());

然后创建类的一个实例--另一个,并分配给您的CloneMe类中的另一个引用。

现在,当你打电话:

代码语言:javascript
复制
  CloneMe clonedObject = actualObject.clone();

然后,只使用CloneMe的现有状态创建一个新的actualObject实例。但是,没有创建任何其他类的新实例(例如,在本例中是另一个),但是将相同的对象引用分配给clonedObject中的引用变量。这被称为浅克隆

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26438552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档