【问题标题】:How clone() method of object class works?对象类的 clone() 方法如何工作?
【发布时间】:2021-04-20 10:56:19
【问题描述】:

对象类 clone() 方法具有本地实现,它创建子类的实例并将源对象的状态复制到新创建的实例。

问题:

  1. 对象类的clone()方法没有调用子类的构造函数,那么它如何创建子类的实例呢?

【问题讨论】:

  • this 回答你的问题了吗?
  • 不。 @WoutervanderLinde 我的问题很简单。 Child childObj = new Child();孩子 childObj1 = childObj.clone(); childObj1 == childObj // 错误。这意味着创建了新对象。现在谁创建这个新对象以及如何在不调用构造函数的情况下创建它是我的问题。我对了解 Java 中克隆的大学水平知识不感兴趣
  • 这能回答你的问题吗? Understanding Object.clone() in Java

标签: java cloneable


【解决方案1】:

克隆是在 JVM 中以一种依赖于实现的方式实现的。在 OpenJDK 中,克隆在第 627 行的 jvm.cpp 中实现为 jvm_clone。这会为对象分配内存并从调用它的对象中复制数据。

创建实例和调用构造函数在 JVM 级别是独立的操作,因此本机实现不需要在创建实例后调用任何构造函数。通过在 C++ 中使用较低级别的 JVM 方法,它不需要调用构造函数。

【讨论】:

    【解决方案2】:

    你的定义是错误的。 clone() 方法不会创建子类的实例,而是创建调用 clone() 方法的类的实例。此实例包含其所有当前值。因此,它不会调用子类的构造函数,而是调用自己类的构造函数。

    【讨论】:

    • 在撰写该评论期间,我没有将其标记为负面,但是,现在我有了。原因是您没有提供定义的来源,我建议您在期待有用的答案之前这样做。
    • 我的回答绝不是否定的。我假设您已经在某个网站上找到了该定义,因为知道该网站可能让我通过使用它周围的上下文来更好地理解该定义。由于您不想提供来源,我只能假设您自己发明了该定义,很遗憾地通知您它是不正确的,或者至少是错误的。
    • @DeepakAgrawal 关于“让专家先阅读并评论它”,当您无法判断时,请不要怀疑其他用户的专业知识。您的定义是可以理解但不精确的(“子类”通常是指“从另一个类继承的类”,而不是“被克隆的类中另一个类的实例”,我猜这就是你的实际意思)所以我可以看到MorganS42 可能会感到困惑。这并没有质疑他们的专业知识。他们的 cmets 没有任何负面影响。
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多