实现 Cloneable 接口如何允许克隆对象,因为它是一个标记接口并且没有任何方法? [复制]

Posted

技术标签:

【中文标题】实现 Cloneable 接口如何允许克隆对象,因为它是一个标记接口并且没有任何方法? [复制]【英文标题】:How does implementing Cloneable interface allows cloning of objects, as it is a Marker Interface and doesn't have any methods? [duplicate] 【发布时间】:2019-03-20 20:45:53 【问题描述】:

我有一个要克隆其对象的类。我通过实现 Cloneable 接口并覆盖 clone 方法来做到这一点。但是,如果我正在创建一个克隆方法,而没有实现 Cloneable 接口,则会引发异常。 这个标记接口(可克隆)为我的班级提供了什么超能力?

【问题讨论】:

Serializable 将对象写入磁盘的方式相同,尽管它是一个标记接口。 This answer to the duplicate 解释了实现Cloneable 的工作原理。界面只是简单地告诉 native Object.clone 方法,“嘿,你可以克隆我”。如果没有接口,该方法将拒绝克隆对象(通过抛出异常)。正如 Elliot 所说,这类似于 Serializable 的使用方式。 【参考方案1】:

在java中克隆对象:

Cloneable 接口。您可能希望该接口有一个 clone() 方法,该方法将返回对象的副本。但是,事实并非如此。 Cloneable 只是一个标记界面。这意味着,它没有任何方法,它只是将类标记为适合克隆。 clone 方法存在于 Object 类中。

【讨论】:

【参考方案2】:

允许根据Object.clone的JavaDoc进行克隆:

首先,如果这个对象的类没有实现接口 Cloneable,然后抛出 CloneNotSupportedException

每次您致电Object.clone() 时,都会验证此要求。

Cloneable 的 JavaDoc 本身说:

一个类实现了Cloneable 接口来指示 Object.clone() 方法,该方法创建一个 该类实例的逐场副本。调用对象 未实现 Cloneable 的实例上的 clone 方法 接口导致异常CloneNotSupportedException被 扔了。

总结一下: 这是指定行为的一部分。在运行时不遵守此要求将是显而易见的。

【讨论】:

以上是关于实现 Cloneable 接口如何允许克隆对象,因为它是一个标记接口并且没有任何方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java 接口 Cloneable

如何实现对象克隆与深拷贝?

创建对象的第二种方式:克隆clone,要实现Cloneable接口

如何实现对象克隆?

(十三)对象克隆

62 如何实现对象克隆?