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

题:
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.
    }
}
    
已邀请:
发生此错误是因为在Object类中clone()方法受到保护。 所以你必须在各自的类中重写clone()方法。 例如。在MyClass中添加以下代码
@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}
还实现了Cloneable接口。 例如。
public class MyClass implements Cloneable
    
clone()
具有受保护的访问权限。在
MyClass
中添加
public Object clone(){  
    try{  
        return super.clone();  
    }catch(Exception e){ 
        return null; 
    }
}
也改为
public class MyClass implements Cloneable
    
因为clone()是受保护的方法。有关详细信息,请参见Object.clone()。 覆盖MyClass中的clone()并使该类实现Cloneable接口。     
您只需要使MyClass实现Cloneable接口。无需为clone()提供实现。     
细微之处在于
MyClass
clone()
方法是继承的,未在
MyClass
中定义。所以
MyClass
可以调用对象的
clone()
,因为它受到保护,但是
MyClass
本身并没有真正的
clone()
,所以
TestSingleTon
不能访问
MyClass
clone()
因为没有
clone()
方法。虽然它们都在同一个包中,但你需要在
MyClass
中定义一个
clone()
方法,以确保它真的“有”
clone()
。顺便说一句,不要忘记为
MyClass
实现接口
Cloneable
。     
为了能够克隆MyClass,它必须实现Cloneable接口     
我做了一些测试代码,这是我的发现: 当受保护的成员跨包继承时,它将成为继承类的私有成员 而 当受保护的成员在同一个包中继承时,它将成为继承类的默认成员。 在您的示例中,Object类中的clone()跨包继承到MyClass中。 Object类在java.lang包中,MyClass在GoodQuestions包中。 因此clone()方法成为MyClass类的私有成员。 这就解释了为什么您无法从TestSingleTon类访问clone()方法。     
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;
}
阅读为什么Josh Bloch的复制构造函数     

要回复问题请先登录注册