以下是Effective Java的引用:
这里是从java.lang.Object的规范中复制的 [JavaSE6]:
创建并返回此对象的副本。的确切含义 “复制”可能取决于对象的类别。一般意图是 对于任何对象x,表达式
x.clone() != x
将是真的,表达式
x.clone().getClass() == x.getClass()
将是真的,但这些并非绝对要求。
通常就是这种情况x.clone().equals(x)
将是真的,这不是绝对的要求。 复制对象通常需要创建新的 类的实例,但可能需要复制内部数据 结构也是如此。没有构造函数被调用。
现在让我们看一下JavaSE6 javadocs
创建并返回此对象的副本。的确切含义 "拷贝"可能取决于对象的类。一般意图是 对于任何对象x,表达式为:
x.clone() != x will be true,
表达式:
x.clone().getClass() == x.getClass()
将会 是的,但这些并非绝对要求。虽然它通常是 案件:
x.clone().equals(x)
将是真的,这不是一个 绝对要求。
他在哪里找到强调的文字?这个要求是什么?
答案 0 :(得分:1)
克隆通常被视为深层拷贝。如果您只克隆"主要对象",则其成员对象不会是深层副本。因此,为了正确地创建克隆,您必须遍历整个对象层次结构并克隆所有可克隆的成员。
使用clone()
通常是一个坏主意,而且非常麻烦。相反,序列化和反序列化对象图更方便。在这种情况下也不会调用构造函数。
答案 1 :(得分:1)
措辞非常糟糕。 o!= o.clone()因为你有两个对象,它们存储在不同的内存位置。它们与两个对同一事物的引用不同。
克隆只是一种按照惯例的方法,你期望一个对象和它的克隆具有相同的类,并且可能想要伤害编写没有实现的方法的人但是,克隆可能是方法名称,对他们意味着什么。
.equals也是一种方法。它是如何实现的?此外,还有一些约定,以及开发人员实施您可能不同意的比较的选项。
没有任何要求,因为这只是一个惯例,并且无论是通过设计还是通过无能,都没有总是遵循。
我们在这里真正谈论的是平等与等同的延伸。