在我之前的文章(java 接口)中谈到过clone,这次我们把他单独拿出来详细说说
让我们先来看一段代码

一,肢解代码,详解报错原因
在这个代码中,我们想要将person1克隆出一份为person2.这时候有聪明的小猪就问了:
"佩奇大王,你都没有写clone这个方法你为什么要调用它?"
实际上 clone这个方法Object已经是定义好了,而我们写的所有类都是Object的子类,所以看似我没写,实际上这个方法已经有了.
"那佩奇大王,你的代码为啥报错了,你这不是自相矛盾吗"
哇,好久没有见到过这么聪明的小猪了,就让佩奇大王来为你解惑答疑吧"
首先告诉大家一个小技巧:
在ideal这个开发工具中摁住Ctrl+N就能搜索各种类的使用方法,当你查找Object的时候我们会发现

是的!Object类中有clone但是他的修饰词是protected,在我之前的文章中提到过,在protected修饰下的类只能访问 在同一个包中的 或者 不同包的子类中访问 .很明显这个Object两者都不是,那怎么办呢?
我们不能直接访问,那为什么不间接访问呢,因为Object是父类,那我们可以这样来:
想要调用这个Object所定义的clone方法,那我们就要重写这个clone方法


好了这下clone方法调用成功了,这时候又有小猪要问了"佩奇大王,为什么你这个还是报错的呀"
小猪的这个问题很好,这是因为这个方法的返回值是Object,这就相当于我们要把父类给子类,这是向下转型,这样的话我们就需要强转.

"佩奇大王,你这强转了之后为什么还是报错?"
很好小猪,这又又又 又引出了一个知识点:
自定义的类型,如果想要被克隆,必须要实现一个接口,叫做inplements Cloneable接口

这个时候我们去查这个接口的源代码,我们会惊奇的发现

他猪的,这是一个空接口!
我们都知道,如果是空接口的话,我们不需要重写这个接口的任何方法.那我们实现这个接口还有什么用?
大家记住,这个空接口,又叫作"标记接口",它表示当前类是可以被克隆的
如果你要克隆一个自定义的类型,那么就一定要实现这个接口

"不是佩奇大王,你这说了这么多,这咋还是报错啊"
ok,我保证这是最后一次报错了,还有最后一个原因:
大家可以看到对于这个clone方法,他有一个异常"CloneNotSupportedException"
我们必须处理了这个异常才不会报错,那我们怎么处理这个异常?很简单

是的你没有看错!(手动滑稽)我们只需要把这个异常移到这里面就行了,这样的话,代码就可以正常运行了.
二,过程总结:
1,重写Object的克隆方法
2,进行强制类型转换

因为返回值是Object所以要进行强转
3,处理异常抛出

4,实现cloneable接口
三,克隆过程图示


271

被折叠的 条评论
为什么被折叠?



