克隆

1、clone()
是java.lang.Object类下面的一个方法。
clone()方法返回的对象叫做原始对象的克隆体。一个克隆对象的基本特性必须是:a.clone()!=a,
这也就意味着克隆对象和原始对象在java 堆(heap)中是两个独立的对象。
a.clone().getClass == a.getClass() 以及 clone.equals(a),也就是说克隆对象完完全全是原始对象的一个拷贝。
但是这些并不是克隆机制强制要求的。意味着clone()返回的对象可能会违反这些约定(通过调用super.clone()方法返回的对象),
当重写clone()方法时,你可以遵循前面两条(a.clone()!=a和a.clone().getClass()==a.getClass())。为了遵循第三个特性(clone.equals(a)),你必须重写equals方法。
需记住的点:
要记住的事情

a:克隆方法用于创建对象的拷贝,为了使用clone方法,类必须实现java.lang.Cloneable接口重写protected方法clone,如果没有实现Clonebale接口会抛出CloneNotSupportedException.

b:在克隆java对象的时候不会调用构造器

c:java提供一种叫浅拷贝(shallow copy)的默认方式实现clone,创建好对象的副本后然后通过赋值拷贝内容,意味着如果你的类包含可变对象,那么原始对象和克隆都将指向相同的内部对象,
这是很危险的,因为发生在可变的字段上任何改变将反应到原始对象和副本对象上。为了避免这种情况,重写clone()方法。

按照约定,实例的克隆应该通过调用super.clone()获取,这样有助克隆对象的不变性建如:clone!=original和clone.getClass()==original.getClass(),尽管这些不是必须的.

posted @ 2017-05-19 20:55  ATJAVA  阅读(197)  评论(0编辑  收藏  举报