问题:
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.
}
}
答案 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;
}