2012-05-02 89 views
1

我从Effective Java
阅读clone它说,在clone被称为第一种方法必须是super.clone()
在这种情况下,我想最终我们会最终调用往上走的层次链的java.lang.Objectclone
但我认为对象的克隆没有做任何事情。
展望代码中,我看到:
protected native Object clone() throws CloneNotSupportedException;并没有实现。
但是从段落看来,如果一个类只有原始字段调用
(ClassX) super.clone()是足以创造一个克隆。
但是如何? super.cloneObject超级克隆做什么?

+0

书中还应该说,这不是一个好主意,用的clone()....你遇到的问题是,你必须依靠正确地实施该方法的超类,否则你会惹上麻烦。要正确地克隆了一个对象,你必须将所有字段(如果文件是原始的,他们显然不可变的,所以你可以简单地复制使用=,而不是克隆的参考,对于任何不可变对象)。不要使用克隆,请尝试复制构造函数或静态工厂方法。好多了。 – Renato

+2

'Object#clone'是作为一个本地方法实现的。见http://stackoverflow.com/questions/6825982/how-does-clone-work-under-the-hood –

回答

3

此声明在对象

protected native Object clone() throws CloneNotSupportedException; 

...意味着该clone方法在本机代码执行;即在幕后有魔法发生。

您可以放心,Object.clone()实际上确实会做一些事情......只要您宣布您的班级实施了Cloneable即可。但它所做的不能用普通的Java来表达。

+0

所以它是原始类型的作品?即做类似'memcopy'的东西? – Jim

+0

它有点像memcopy。它会执行低级复制所有字段以及对象头中的一些隐藏信息。 –

2

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

1

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

如果对象不支持克隆,它会抛出CloneNotSupportedException,这意味着如果您尝试克隆超级对象并且出现异常,则可以在您的子类型中也没有实现克隆对象,并且该对象不能被克隆......有几种情况禁止对象克隆操作是正确的。