来自对象的方法clone()不可见?

时间:2011-02-25 10:46:19

标签: java methods clone cloneable

问题:

package GoodQuestions;
public class MyClass {  
    MyClass() throws CloneNotSupportedException {
        try {
            throw new CloneNotSupportedException();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }   

    public static void main(String[] args) {    
        try {
            MyClass  obj = new MyClass();
            MyClass obj3 = (MyClass)obj.clone();            
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

这里的类'MyClass'能够通过调用'Object'类中的clone方法来克隆自己的对象。 当我尝试在同一个包'GoodQuestions'中的另一个类('TestSingleTon')中克隆这个类('MyClass')时,它会抛出以下编译时错误。

'Object类型的方法clone()不可见 '

所以这是抛出上述错误的代码?

package GoodQuestions;
public class TestSingleTon {
    public static void main(String[] args) {
        MyClass  obj = new MyClass();
        MyClass obj3 = obj.clone(); ---> here is the compile error.
    }
}

8 个答案:

答案 0 :(得分:44)

clone()已保护访问权限。在MyClass

中添加此内容
public Object clone(){  
    try{  
        return super.clone();  
    }catch(Exception e){ 
        return null; 
    }
}

同时更改为public class MyClass implements Cloneable

答案 1 :(得分:9)

发生此错误是因为在Object类中clone()方法受到保护。 所以你必须在各自的类中重写clone()方法。 例如。在MyClass中添加以下代码

@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}

还实现Cloneable接口。 例如。 public class MyClass implements Cloneable

答案 2 :(得分:3)

因为clone()是受保护的方法。有关详细信息,请参阅Object.clone()

在MyClass中覆盖clone()并使类实现Cloneable接口。

答案 3 :(得分:1)

你只需要让Class实现Cloneable接口。无需为clone()提供实现。

答案 4 :(得分:1)

微妙之处在于,clone() MyClass方法是继承的,未在MyClass中定义。因此,MyClass可以调用对象的clone(),因为它是受保护的,但MyClass并非拥有 a { {1}} clone()本身TestSingleTon无法访问clone() MyClass,因为没有clone()方法。虽然它们都在同一个包中,但您需要在clone()中定义一个MyClass方法,以确保它真的具有" clone()。顺便说一句,不要忘记为Cloneable实施界面MyClass

答案 5 :(得分:0)

为了能够克隆MyClass,它必须实现Cloneable接口

答案 6 :(得分:0)

我在这上面做了一些测试代码,这是我的发现:

当跨包继承受保护的成员时,它将成为继承类的私有成员

,而

当受保护的成员在同一个包中继承时,它将成为继承类的默认成员。

在您的示例中,Object类中的clone()跨包继承到MyClass中。 Object类在java.lang包中,MyClass在GoodQuestions包中。 因此clone()方法成为MyClass类的私有成员。

这解释了为什么您无法从TestSingleTon类访问clone()方法。

答案 7 :(得分:0)

Object.clone()方法具有受保护的访问权限,即it's visible to sub-classes and classes in the same package

最好有一个复制构造函数来手动复制对象。

/**
    Deep copy all the information from other to this
*/
public MyClass (MyClass  other) {
     this.id = other.id;
}

阅读Why a copy constructor from Josh Bloch