【问题标题】:What does super's clone do?super的克隆有什么作用?
【发布时间】:2012-05-02 06:26:09
【问题描述】:

我正在阅读来自 Effective Java 的有关 clone 的信息
它说在clone 中,第一个被调用的方法必须是super.clone()
在这种情况下,我猜我们最终会调用 clonejava.lang.Object 向上层级链。
但我认为该对象的克隆没有任何作用。
查看代码我看到:
protected native Object clone() throws CloneNotSupportedException; 并且没有实现。
但从段落看来,如果一个类只有原始字段调用
(ClassX) super.clone() 足以创建一个克隆。
但是怎么做? super.clone 属于 Object

【问题讨论】:

  • 书上也应该说使用clone()不是个好主意....你遇到的问题是必须依赖超类正确实现方法,否则你会遇到麻烦。要正确克隆一个对象,您必须复制所有字段(如果文件是原始文件,它们显然是不可变的,因此您可以使用 = 而不是克隆简单地复制引用,就像任何不可变对象一样)。尝试使用复制构造函数或静态工厂方法,而不是使用克隆。好多了。
  • Object#clone 被实现为原生方法。见stackoverflow.com/questions/6825982/…

标签: java


【解决方案1】:

Object 中的这个声明

  protected native Object clone() throws CloneNotSupportedException;

... 表示clone 方法是在本机代码中实现的;即幕后有魔法。

您可以放心,Object.clone() 实际上确实做了一些事情……前提是您已将您的类声明为实现Cloneable。但它的作用无法用普通的 Java 来表达。

【讨论】:

  • 所以它适用于原始类型? IE。像memcopy这样的事情吗?
  • 有点像memcopy。它对所有字段以及对象标头中的一些隐藏信息进行低级复制。
【解决方案2】:

clone() 是 Java 中用于对象复制的方法。在 Java 中,对象是通过引用变量来操作的,并且没有用于复制对象的操作符——赋值操作符复制的是引用,而不是对象。 clone() 方法提供了这个缺失的功能。

【讨论】:

    【解决方案3】:

    没错,当你克隆一个对象时,你应该总是调用super.clone()(作为第一条语句),然后手动克隆对象的其余部分,这是因为当你克隆一个对象时,你必须确保对象的超类部分也以正确的方式克隆...

    如果一个对象不支持克隆它会抛出 CloneNotSupportedException ,这意味着如果你尝试克隆一个超级对象并且你得到异常,你不能在你的子类型中实现克隆对象,并且对象不能be cloned ... 有几种情况禁止对象克隆操作是对的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-28
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2011-09-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多