JAVA中clone()方法与Cloneable接口详细说明


结合java.lang部分源码+内部资料+http://onlylove.iteye.com/blog/265113的博客

clone( )方法

clone( )方法创建调用它的对象的一个复制副本


简单地说, Clone 就是对于给定的一个对象实例 o ,得到另一个对象实例 o’ : o 与 o’ 类 型相同( o.getClass() == o’.getClass() ),内容相同(对于 o/o’ 中的字段 f ,如果 f 是基本数据类型,则 o.f == o’.f ;如果 f 是对象引用,则 o.f == o’.f 或 o.f 指向的对象与 o’.f 指向的对象的内容相同)。通常称 o’ 为 o 的克隆或副本。


需要注意的是:

当一个副本被创建时,并没有调用被复制对象的构造函数。副本仅仅是原对象的一个简单精确的拷贝。复制是一个具有潜在危险的操作,因为它可能引起不是你所期望的副作用。

例如,假如被复制的对象包含了一个称为obRef的引用变量,当副本创建时,副本中的obRef如同原对象中的obRef一样引用相同的对象。如果副本改变了被obRef引用的对象的内容,那么对应的原对象也将被改变。另一种情况,如果一个对象打开一个I/O流并被复制,两个对象将可操作相同的流。而且,如果其中一个对象关闭了流,而另一个对象仍试图对I/O流进行写操作的话,将导致错误。


java.lang.Object中对于clone()的定义

protected native Object clone() throws CloneNotSupportedException;

该方法是 protected 的,意味着子类需要显式重载clone()方法以使它变为public,或者调用super.clone()方法的类 必须实现Cloneable接口

java.lang.Cloneable接口 

public interface Cloneable {}


只有接口定义

看到这里可能觉得奇怪,Cloneable接口中什么都没有,要它有什么用?
此时,回头再看一下clone()方法发现该方法又是native 的,必然做了与具体平台相关的底层工作。

事实上,类 Object 的 clone() 方法首先会检查 this.getClass() 是否实现了 Cloneable 接口。 <
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值