0

按照java.lang.Cloneable界面:

文档Cloneable-

请注意,此接口不包含 clone 方法。因此,不可能仅凭借实现该接口的事实来克隆对象。即使以反射方式调用 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");
    }

}
4

3 回答 3

4

在您的情况下,Object调用方法,因为每个类都继承自java.lang.Object该类。此clone()实现仅进行逐个字段的复制。

Cloneable是一个标记界面。标记接口是既没有定义方法也没有定义变量的接口,但用于在运行时提供有关对象的类型信息。

通过将此标记接口添加到您的类定义中,可以保证CloneNotSupportedException调用您的类时不会抛出任何错误clone


一般建议是查看Copy Constructor 与 Cloning (Josh Bloch) 是否真的想使用clone

于 2012-07-15T19:24:55.053 回答
3

根类java.lang.Object包含方法clone()。默认情况下,如果具体类实现 Cloneable,则默认类实现会进行浅拷贝。

从方法文档:

类 Object 的方法 clone 执行特定的克隆操作。首先,如果该对象的类没有实现接口 Cloneable,则抛出 CloneNotSupportedException。...因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

于 2012-07-15T19:23:19.977 回答
1

clone()方法由java.lang.Object, 作为受保护的方法实现。您的代码有效,因为您clone()从与您克隆的类相同的类中调用该方法。

如果您希望您的对象是可克隆的,您应该重写该clone()方法并将其公开:

public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

请注意,文档并没有说实现 Cloneable 接口总是会clone()失败。它说实施它并不能保证clone()会奏效。这是非常不同的。

于 2012-07-15T19:28:55.097 回答