java语言之Cloneable接口
2015-11-04 10:46
435 查看
在我们学习过程中,会发现java很多非常重要的接口,比如Cloneable,Serializable,Comparable等等之类的,今天我就总结一下Cloneable接口。
我学习到现在觉得最好的学习资源就是源码以及源码的注释,任何其他的都是对源码的翻译和解读,现在我就说说我对源码及注释的理解,如何大家想从源头上获取,建议大家看Cloneable接口和Object中的clone()方法。
正文:
1.如果一个对象要实现拷贝,就必须要实现Cloneable接口,只有实现了该接口,该类的对象采用拷贝的能力,否则调用clone()是会抛出CloneNotSupportedException异常
2.拷贝分为浅拷贝和深拷贝
浅拷贝是拷贝的默认方式(逐个field拷贝),只适用于基本数据类型和不可变类型(如String)
深拷贝是适用于有引用成员变量的情形,因为浅拷贝在拷贝应用成员变量时只是拷贝了引用,所以要自己特别处理,若不处理拷贝出来的对象都是公用一块内存(一变都变)
例子:
浅拷贝:
深拷贝:
引用类型:
Main:
拷贝还设计到一个设计模式:原型模式~~~ 有兴趣自己看~~~
我学习到现在觉得最好的学习资源就是源码以及源码的注释,任何其他的都是对源码的翻译和解读,现在我就说说我对源码及注释的理解,如何大家想从源头上获取,建议大家看Cloneable接口和Object中的clone()方法。
正文:
1.如果一个对象要实现拷贝,就必须要实现Cloneable接口,只有实现了该接口,该类的对象采用拷贝的能力,否则调用clone()是会抛出CloneNotSupportedException异常
2.拷贝分为浅拷贝和深拷贝
浅拷贝是拷贝的默认方式(逐个field拷贝),只适用于基本数据类型和不可变类型(如String)
深拷贝是适用于有引用成员变量的情形,因为浅拷贝在拷贝应用成员变量时只是拷贝了引用,所以要自己特别处理,若不处理拷贝出来的对象都是公用一块内存(一变都变)
例子:
浅拷贝:
public class Resume_ShallowCopy implements Cloneable { private String name; private String sex; private String age; private String timeArea; private String company; public Resume_ShallowCopy(String name) { this.name = name; } public void setPersonalInfo(String sex, String age) { this.sex = sex; this.age = age; } public void setWorkExperience(String timeArea, String company) { this.timeArea = timeArea; this.company = company; } public void display() { System.out.println(name + ", " + sex + ", " + age); System.out.println("工作经历:" + timeArea + ", " + company); System.out.println(age.hashCode()); System.out.println(); } }
深拷贝:
public class Resume_DeepCopy implements Cloneable { private String name; private String sex; private String age; private WorkExperience work; // 引用类型 public Resume_DeepCopy(String name) { this.name = name; work = new WorkExperience(); } public Resume_DeepCopy(WorkExperience work) throws CloneNotSupportedException { this.work = (WorkExperience) work.clone(); } public void setPersonalInfo(String sex, String age) { this.sex = sex; this.age = age; } public void setWork(String workDate, String company) { work.setWorkDate(workDate); work.setCompany(company); } public void display() { System.out.println(name + ", " + sex + ", " + age); System.out.println("工作经历:" + work.getWorkData() + " " + work.getCompany()); } @Override protected Object clone() throws CloneNotSupportedException { Resume_DeepCopy obj = new Resume_DeepCopy(work);//把work拷贝一下 obj.name = name;// 逐个拷贝 obj.sex = sex; obj.age = age; return obj; } }
引用类型:
public class WorkExperience implements Cloneable { private String workDate; private String company; public String getWorkData() { return workDate; } public void setWorkDate(String workData) { this.workDate = workData; } public String getCompany() { return company; } public void setCompany(String company) { this.company = company; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
Main:
public class Console { public static void main(String[] args) throws CloneNotSupportedException { Resume_DeepCopy a = new Resume_DeepCopy("大鸟"); a.setPersonalInfo("男", "29"); a.setWork("1998-2000", "XX公司"); Resume_DeepCopy b = (Resume_DeepCopy) a.clone(); b.setWork("1998-2006", "YY企业"); Resume_DeepCopy c = (Resume_DeepCopy) a.clone(); c.setPersonalInfo("男", "24"); c.setWork("1998-2003", "ZZ企业"); a.display(); b.display(); c.display(); } }
拷贝还设计到一个设计模式:原型模式~~~ 有兴趣自己看~~~
相关文章推荐
- java I/O Stream 代码学习总结
- 菜鸟学习Spring——SpringMVC注解版在服务器端获取Json字符串并解析
- Java修饰符 abstract,static,final 的区别详解
- 菜鸟学习Spring——SpringMVC注解版解析不同格式的JSON串 GOOD
- 用java实现反转链表
- 菜鸟学习Spring——SpringMVC注解版将URL中的参数转成实体
- Java语言基础之集合乱舞step1
- Spring缓存注解@Cache使用
- Java POI Excel导出文件名中文乱码
- Java 定时器的使用:每天定时执行任务
- Spring 让 LOB 数据操作变得简单易行
- springmvc注解
- 【Java】【Flume】Flume-NG启动过程源码分析(一)
- SpringMVC第一个例子
- rxJava的使用
- eclipse如何关联javadoc和源码
- Spring的IoC(控制反转) 、DI(依赖注入)
- 运用Eclipse 的Jetty插件直接部署
- 为什么选择 Java 8 ?
- 说说Java中的实例初始化器