java 再谈clone

在我之前的文章(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接口

三,克隆过程图示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值