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