根据java.lang.Cloneable接口:
文档 for Cloneable说-
请注意,此接口不包含克隆方法。因此,不可能仅仅依靠对象实现此接口这一事实来克隆对象。即使克隆方法被反思广益地调用,也不能保证它会成功。
但是下面的代码工作正常。当我调用ex1.clone时,它不会产生任何错误。
package com.sriPushpa.thread;
public class exceptionHandling implements Cloneable {
int a = 10;
public static void main(String args[]) {
exceptionHandling ex1 = new exceptionHandling();
exceptionHandling ex2 = null;
try {
ex2 = (exceptionHandling) ex1.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println("SUCCESS");
}
}发布于 2012-07-15 19:28:55
clone()方法由java.lang.Object实现,作为一个受保护的方法。您的代码之所以工作,是因为您从与克隆类相同的类调用clone()方法。
如果您希望您的对象是可克隆的,则应该重写clone()方法并将其公开:
public Object clone() throws CloneNotSupportedException {
return super.clone();
}请注意,文档并没有说实现Cloneable接口总是会导致clone()失败。它说,实现它并不能保证clone()能够工作。这是非常不同的。
发布于 2012-07-15 19:24:55
在您的示例中,将调用Object方法,因为每个类都继承自java.lang.Object类。此clone()实现只执行逐字段复制。
Cloneable是一个标记接口。标记接口是一个接口,它既没有定义方法,也没有定义变量,而是用于在运行时提供有关对象的类型信息。
通过将这个标记接口添加到类定义中,可以保证不会通过调用类上的CloneNotSupportedException抛出任何clone。
一般的建议是看看复制构造器与克隆 (乔希·布洛赫)是否真的想要使用clone。
发布于 2012-07-15 19:23:19
根类java.lang.Object包含方法克隆()。默认情况下,如果具体类实现了Cloneable,则默认类实现将生成一个浅拷贝。
在方法文档中:
类对象的方法克隆执行特定的克隆操作。首先,如果该对象的类不实现接口Cloneable,则抛出一个CloneNotSupportedException。..。因此,该方法执行该对象的“浅拷贝”,而不是“深度复制”操作。
https://stackoverflow.com/questions/11494865
复制相似问题