java 克隆clone学习
2016-09-07 17:50
225 查看
文章参考 :http://www.java3z.com/cwbwebhome/article/article8/81145.html?id=2600
Java Object类提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所谓“自我克隆”就是得到一个当前对象的副本,而且两者之间完全隔离,该方法只能被子类重写或调用。
自定义类实现“克隆”的步骤:
1、自定义类实现Cloneable接口;(这是个标记性接口,实现该接口对象可以实现“自我克隆”,接口里没有定义任何方法,否则不能执行clone方法)
2、自定义类实现自己的clone()方法
3、实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。
备注:标记性接口是没有任何方法和属性的接口。它仅仅表明他的类属于一个特定的类型,供其他代码来测试允许做一些事情。使用标记性接口的唯一目的是使得可以用instanceof进行类型查询,例如:
if(obj instanceof Cloneable){......}
一些容器例如EJB容器,servlet容器或运行环境依赖标记接口识别类是否需要进行某种处理,例如serialiable接口标记类需要进行序列化操作。
Object类的clone()方法虽然简单、易用,但它只是一种“潜克隆”——它只克隆该对象的所有Field值,不会对引用类型的Field值所引用的对象克隆。如果需要“深克隆”,则需要开发者自己进行“递归”克隆,保证所有引用类型的Field值所引用的对象都被复制了。
大小: 10.5 KB
查看图片附件
Java Object类提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所谓“自我克隆”就是得到一个当前对象的副本,而且两者之间完全隔离,该方法只能被子类重写或调用。
自定义类实现“克隆”的步骤:
1、自定义类实现Cloneable接口;(这是个标记性接口,实现该接口对象可以实现“自我克隆”,接口里没有定义任何方法,否则不能执行clone方法)
2、自定义类实现自己的clone()方法
3、实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。
备注:标记性接口是没有任何方法和属性的接口。它仅仅表明他的类属于一个特定的类型,供其他代码来测试允许做一些事情。使用标记性接口的唯一目的是使得可以用instanceof进行类型查询,例如:
if(obj instanceof Cloneable){......}
一些容器例如EJB容器,servlet容器或运行环境依赖标记接口识别类是否需要进行某种处理,例如serialiable接口标记类需要进行序列化操作。
package hb.com.clone; class Address{ String detail; public Address(String detail){ this.detail = detail; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String print(){ System.out.println(this.detail); return this.detail; } }
package hb.com.clone; public class User implements Cloneable{ public int age; public Address address; public User(int age){ this.age = age; this.address = new Address("地名"); } public User clone(){ try { return (User)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } }
public class CloneTest { public static void main(String[] args) { User u1 = new User(29); //u1克隆之后,会单独开辟一块内存空间,u2指向的地址与u1不一致 // x.clone() != x // x.clone().getClass() == x.getClass() // x.clone().equals(x) User u2 = u1.clone(); System.out.println(u1==u2); //false // primitive的确做到了相等且隔离。 // 引用类型仅仅是复制了一下引用 System.out.println(u1.address ==u2.address); //true //值相等,实际上内存不是指向同一个位置 System.out.println(u1.age == u2.age); System.out.println(u1.address.print()); u1.address.setDetail("地名1"); System.out.println(u1.address.print()); System.out.println(u2.address.print()); } }
Object类的clone()方法虽然简单、易用,但它只是一种“潜克隆”——它只克隆该对象的所有Field值,不会对引用类型的Field值所引用的对象克隆。如果需要“深克隆”,则需要开发者自己进行“递归”克隆,保证所有引用类型的Field值所引用的对象都被复制了。
大小: 10.5 KB
查看图片附件
相关文章推荐
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- Java学习,常用包,"=="和"equals",clone()
- Java中的克隆(Clone)机制
- java--为自己的类对象添加clone(克隆)能力
- JAVA 复制对象时为什么要用克隆clone()而不用“=”的原因
- Java中的克隆(Clone)机制
- Java中的克隆(Clone)机制
- Java克隆(Clone)的应用
- java知识点总结(==和equals,对象克隆clone等)
- 深度克隆 java.lang.Cloneable
- Java克隆(Clone)的应用
- Java克隆(Clone)的应用
- Java克隆(Clone)的应用
- java实现shadow clone(浅克隆)与深克隆(deep clone)
- Java克隆(Clone)的应用
- java克隆(Clone)
- java知识点总结(==和equals,对象克隆clone等)
- Java clone() 浅克隆与深度克隆
- Java Deep Clone Shallow Clone 深克隆和浅克隆
- Java中的克隆(CLONE)