使类具有克隆本领[Java编程]
本文“使类具有克隆本领[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
固然克隆办法是在全部类最基本的Object中定义的,但克隆仍旧不会在每个类里自动举行.这仿佛有些难以想象,因为底子类办法在衍生类里是必定能用的.但Java确切有点儿反其道而行之;假如想在一个类里利用克隆办法,唯一的办法就是专门增添一些代码,以便保证克隆的正常举行.
1. 利用protected时的本领
为避免我们成立的每个类都默许具有克隆本领,clone()办法在底子类Object里得到了“保存”(设为protected).这样造成的后果就是:对那些简单地利用一下这个类的客户程序员来说,他们不会默许地拥有这个办法;其次,我们不能操纵指向底子类的一个句柄来调用clone()(固然那样做在某些情形下分外有效,比方用多形性的方法克隆一系列对象).在编译期的时刻,这实际是告诉我们对象不可克隆的一种方法——并且最奇特的是,Java库中的大大都类都不能克隆.因此,假定我们履行下述代码:
Integer x = new Integer(l);
x = x.clone();
那么在编译期,就有一条讨厌的错误消息弹出,奉告我们不可拜候clone()——因为Integer并没有覆盖它,并且它对protected版本来说是默许的).
但是,假如我们是在一个从Object衍生出来的类中(全部类都是从Object衍生的),就有权调用Object.clone(),因为它是“protected”,并且我们在一个担当器中.底子类clone()供应了一个有效的功效——它举行的是对衍生类对象的真正“按位”复制,所以相当于尺度的克隆行动.但是,我们随后需求将自己的克隆操作设为public,不然无法拜候.总之,克隆时要注意的两个关键问题是:几近必定要调用super.clone(),以及注意将克隆设为public.
有时还想在更深层的衍生类中覆盖clone(),不然就直接利用我们的clone()(目前已成为public),而那并不一定是我们所但愿的(但是,由于Object.clone()已制作了实际对象的一个副本,所以也有大概答应这种情形).protected的本领在这里只能用一次:初次从一个不具有克隆本领的类担当,并且想使一个类变成“可以克隆”.而在从我们的类担当的任何场所,clone()办法都是可以利用的,因为Java不大概在衍生之后反而缩小办法的拜候范围.换言之,一旦对象变得可以克隆,从它衍生的任何东西都是可以克隆的,除非利用特别的机制(背面谈论)令其“关闭”克隆本领.
2. 实现Cloneable接口
为使一个对象的克隆本领功成圆满,还需求做另一件事情:实现Cloneable接口.这个接口令人稍觉奇特,因为它是空的!
interface Cloneable {}
之所以要实现这个空接口,明显不是因为我们预备上溯造型成一个Cloneable,以及调用它的某个办法.有些人认为在这里利用接口属于一种“拐骗”行为,因为它利用的特点打的是别的主张,而非本来的意思.Cloneable interface的实现扮演了一个标志的角色,封装到类的范例中.
两方面的缘由促成了Cloneable interface的存在.首先,大概有一个上溯造型句柄指向一个底子范例,并且不知道它能否真的能克隆那个对象.在这种情形下,可用instanceof关键字(第11章有介绍)调查句柄能否确切同一个能克隆的对象衔接:
if(myHandle instanceof Cloneable) // ...
第二个缘由是考虑到我们大概不肯全部对象范例都能克隆.所以Object.clone()会考证一个类能否真的是实现了Cloneable接口.若答案能否定的,则“掷”出一个CloneNotSupportedException违例.所以在普通情形下,我们必须将“implement Cloneable”作为对克隆本领供应支持的一部份.
以上是“使类具有克隆本领[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java的clone实现
- ·下一篇文章:java克隆对象
- ·中查找“使类具有克隆本领”更多相关内容
- ·中查找“使类具有克隆本领”更多相关内容