根据java.lang.Cloneable
界面:
Cloneable
的{{3}}表示 -
请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。
但以下代码正常运行。当我拨打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");
}
}
答案 0 :(得分:4)
在您的情况下,调用Object
的方法,因为每个类都继承自java.lang.Object
类。此clone()
实现仅执行逐个字段的复制。
Cloneable
是标记界面。标记接口是既未定义方法也未定义变量的接口,但用于在运行时提供有关对象的类型信息。
通过在您的班级定义中添加此标记界面,可以保证在您的班级上调用CloneNotSupportedException
时不会抛出clone
。
一般建议是看看Copy Constructor versus Cloning(Josh Bloch)是否真的想要使用clone
。
答案 1 :(得分:3)
根类java.lang.Object
包含方法clone()。默认情况下,如果具体类实现Cloneable,则默认类实现会生成浅表副本。
从方法文档:
Object类的方法clone执行特定的克隆 操作。首先,如果此对象的类没有实现 接口Cloneable,然后抛出CloneNotSupportedException。 ... 因此,此方法执行此对象的“浅拷贝”,而不是a “深层复制”操作。
答案 2 :(得分:1)
clone()
方法由java.lang.Object
实现,作为受保护的方法。您的代码有效,因为您从与克隆的类相同的类中调用clone()
方法。
如果您希望对象可以克隆,则应覆盖clone()
方法并将其公开:
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
请注意,doc并未说明实现Cloneable接口始终会使clone()
失败。它说实施它并不能保证clone()
能够发挥作用。这是非常不同的。