关于java中可克隆接口和object.clone()的混淆

关于java中可克隆接口和object.clone()的混淆,java,cloneable,Java,Cloneable,如果我有: class foo implements Cloneable 然后做: bar = new foo(); bar.clone(); 我得到了一个浅拷贝,而不需要编写任何bar.clone()代码,就像我实现接口时通常需要做的那样 我的理解是,接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,“类对象本身没有实现接口可克隆”) 那么我的浅克隆人来自哪里?如果Object.clone()没有实现,那么实现bar.clone()的代码在哪里?我很困惑。

如果我有:

class foo implements Cloneable
然后做:

bar = new foo();
bar.clone();
我得到了一个浅拷贝,而不需要编写任何
bar.clone()
代码,就像我实现接口时通常需要做的那样

我的理解是,接口的函数必须由实现它的类填充,并且
Object.clone()
没有实现(根据文档,“类对象本身没有实现接口可克隆”)

那么我的浅克隆人来自哪里?如果
Object.clone()
没有实现,那么实现
bar.clone()的代码在哪里?我很困惑。

Object.clone()有一个实现:

此链接介绍了可克隆界面:

对象必须实现可克隆接口才能调用clone()方法,否则,它将抛出CloneNotSupportedException

根据定义,Java中的所有类都扩展了基本对象类,并且对象类有一个默认的clone()方法,即使对象本身没有实现Cloneable。如果您自己不重写对象类的clone()方法,将调用该方法。

使用clone时要非常小心。事实上,我会完全避免它。我从来都不需要它。但是话虽如此,我读过的关于这个话题的最好的讨论是Joshua Bloch用有效的Java进行的。阅读第11项:“明智地覆盖克隆”

请帮自己一个忙,读一下那篇文章。实际上,我建议你阅读整章(以及本书的其余部分)。你们需要知道的关于克隆人的一切,以及我为什么要提醒你们,都在那个里

希望这有帮助

如果我有:“类foo实现 可克隆的”

然后执行:bar=newfoo(); bar.clone()

我得到一份浅薄的副本而不需要 像我一样编写任何bar.clone()代码 通常情况下,当我 实现一个接口

只有在类“foo”中调用它时,这才有效,因为从
对象继承的.clone()方法受保护

我的理解是 必须填充接口的函数 在实现它的类中,以及 Object.clone()没有实现 (根据文档,“类对象 它本身并没有实现 接口可克隆“

(1)
Object.clone()
确实有一个实现。如果对象实现了
Cloneable
,它将生成对象的浅拷贝。(2)
.clone()
方法不是任何接口的一部分。(3) 拥有
.clone()
方法和实现
Cloneable
接口是完全不同的。如果要使用
对象
克隆
方法,只需实现
可克隆
界面;但是,这是为类编写
clone
方法的推荐方法——从超类的
clone
方法获取其副本,该方法最终会升级到
Object
clone
方法

我的理解是,接口的函数必须由实现它的类填充,而Object.clone()没有实现(根据文档,“类对象本身并不实现接口Cloneable”)

Object.clone()没有实现是有区别的 类对象本身并不实现接口可克隆性

对象的克隆方法没有实现,它没有调用克隆方法的对象的内存拷贝

您是对的,对象类不实现可克隆,它所做的只是检查对象是否可克隆

以上的答案是你读一些书,我想我可以给出一个快速的解决方案 所以我来回答你的问题

那么我的浅层克隆来自哪里? 对象的克隆方法

如果Object.clone()没有实现,那么实现bar.clone()的代码在哪里?
它有用本机代码编写的实现。

啊,我明白了。我误读了docs-object确实有clone()的代码,它只是没有实现cloneable,那么为了调用class.clone(),强制实现cloneable的机制是什么呢?这仅仅是JRE意识到的故意检查的东西吗?快速的答案是——没有。接口数据终止对象的clone()实现的行为。如果类是可克隆的,Object.clone()将返回一个副本,否则将抛出CloneNotSupportedException。Cloneable接口本质上修改了其超类实现clone().+1的行为,以实现有效的Java。关于克隆的讨论非常棒,整本书也是如此。这几乎应该是唯一的答案。鉴于Joshua Bloch对Cloneable中固有的设计缺陷进行了出色的讨论,人们几乎可以说这只是Java中的一个设计错误。使用复制构造函数/静态工厂几乎总是更好。谢谢,是的,你写了-我的不好,因为我误读了这句话,并将“implements Connable”与“having a a implementation”混为一谈。只有在类“foo”中调用它,这才有效,因为从Object继承的.clone()方法受到保护。”.如果我的子类调用foo.clone(),该怎么办?这是绝对可能的,对吗?@Amarnatharish:如果你的意思是class
foo
没有实现任何
clone()
方法,并且你有一个class
subfo
扩展
foo
,在
subfoo
内部调用
new foo().clone()
,不,那是行不通的,因为
clone()
在不同的包中声明,并且当受保护成员在不同的包中声明时,
subfo
无法访问非其自身类型的表达式上的受保护成员(例如
foo
),我从未提及过
subfo
在不同的包中,所以我想它可以从同一个包中访问,而无需worries@amarnathhari