来自对象的方法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')时,抛出下面的编译时错误。

'从Objecttypes的方法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()的实现。

我做了一些testing代码,这是我的发现:

当一个受保护的成员通过包被inheritance时,它成为inheritance类的私有成员

当一个受保护的成员在同一个包中被inheritance时,它就成为inheritance类的默认成员。

在你的例子中,来自Object类的clone()被跨包inheritance到MyClass中。 对象类在java.lang包中,MyClass在GoodQuestions包中。 所以clone()方法成为MyClass类的私有成员。

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

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

微妙之处在于MyClassclone()方法是inheritance的, MyClass中没有定义。 因此, MyClass可以调用Object的clone()方法,因为它是受保护的 ,但是MyClass本身没有clone() ,所以TestSingleTon不能访问MyClass clone()方法,因为没有clone()方法。 虽然它们都在同一个包中,但是您需要在MyClass定义一个clone()方法,以确保它具有“拥有” clone() 。 顺便说一句,不要忘记实现MyClass Cloneable接口。