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