java clone和深度复制和浅复制的个人总结
2015-12-12 12:08
465 查看
1.clone() 和“=”的比较
在基本类型变量里的赋值如: int a = 1;int b = a;a与b有相同的值,改变a或b的值不影响彼此。但对象间的:
java.util.Date date1 = new java.util.Date();java.util.Date date2 = date1;
date1 与date2指向相同的对象,指向相同的存储空间。就像小明的外号叫明明,小明和明明都指向同一个人。可以通过改变date1 或date2 的值,都会使对象发生改变。
使用clone就是区别于上面的引用复制。
java.util.Date date1 = new java.util.Date();java.util.Date date2 = (java.util.Date)date1.clone;
date1 与date2指向不相同的对象,但数据是相同的,就像是两个衣着相同的不同的人。date1 与date2间的操作互不影响,他们有各自的存储空间。可见,通过date1.clone()为date3 new了一个对象。
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub java.util.Date date1 = new java.util.Date(); java.util.Date date2 = date1; java.util.Date date3 =(java.util.Date) date1.clone(); System.out.println("date1 == date2?"+(date1 == date2)); System.out.println("date1 == date2?"+(date1 == date3)); } }输出结果:date1 == date2 true(使用“=”)
date1 == date3 false(使用clone())
2.clone()和Cloneable接口。
所有类都默认继承了object类,object 类中定义有clone()方法,返回类型:object,修饰符为protect ,子类可用。所以无法对类的变量直接使用clone方法(如:定义了某个类Student,声明变量aStudent并创建了对象,但无法使用aStudent.clone())。实现clone()的方法:要通过类中重写clone的方法,修饰符改为public。除此之外,还必须实现Cloneable接口,否则会抛出异常(详细看别人的总结http://onlylove.iteye.com/blog/265113,我水平还不行,借鉴学习 )。上面的Date类可以直接使用clone()方法,是因为默认实现了Cloneable,另外还有ArrayList,Calendar类可直接使用。
class Student implements Cloneable { int number; String name; @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } }Student 类实现了接口,有克隆的方法。
3.clone()的深浅复制。
在一个类中,如果数据域全都是基本类型,无需考虑深浅复制。如果数据域含有对象,则考虑深浅复制的问题了。
class Student implements Cloneable {
int number;
String name;
java.util.Date date;
@Override public Object clone() throws CloneNotSupportedException{ return super.clone(); }
}
该类中有Date类的对象,如果直接使用上面的方法实现clone(),基本类型的变量都还是实现clone,但类型为对象的date1克隆的只是个引用。
Student student1 = new Student();
Student student2 = student1.clone();
比较:
student1.number == student2.number false
student1.name == student2.name false
student1.date == student2.date true
这就是浅复制,date 并没有实现克隆,而是复制了引用。相当于“=”。此时与上面总结1一样,student1 和 student2的date指向同一个对象。
深度复制
深度复制就是实现浅复制中date没有克隆的情况。将上面的Student类的clone()方法重写:
class Student implements Cloneable { int number; String name; java.util.Date date; @Override public Object clone() throws CloneNotSupportedException { Student studentClone = (Student) super.clone(); studentClone.date = (java.util.Date) this.date.clone(); return studentClone; } }此时
Student student1 = new Student();
Student student2 = student1.clone();
比较:
student1.number == student2.number false
student1.name == student2.name false
student1.date == student2.date false
实现了该类的深度复制。student1 和 student2的date指向不同一个对象。
(如有错误,欢迎指正~)
相关文章推荐
- Java Socket(三) URL的应用
- [java] 浅析ClassLoader
- 使用PohtoView出现java.lang.IllegalArgumentException: pointerIndex out of range
- 【6】BOM
- commons之函数式编程2_ClosureJava139
- Android项目打包、Eclipse视图和UI控件
- Java - 位运算
- Java容器的概要
- JAVA 中配置IKAnalyzer扩展词库和停止词库
- Java各个历史版本下载链接
- JAVA随堂笔记课【三】:面向对象
- java 搭建web项目
- java解析xml
- springmvc 多文件上传
- 计算两个日期相差天数:
- 使用struts2控制文件上传
- JavaEE SSH框架整合(四) 日志处理Spring结合 log4j、slf4j [转]
- Java中对象的类型判断
- java中的this与super的区别
- springmvc 接收json对象的两种方式