Java.lang.Cloneable接口指南的问题

时间:2012-07-15 19:20:05

标签: java clone

根据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");
    }

}

3 个答案:

答案 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()能够发挥作用。这是非常不同的。