java clone和深度复制和浅复制的个人总结
来源:互联网 发布:全炫茂 知乎 编辑:程序博客网 时间:2024/05/22 09:53
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 stubjava.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;@Overridepublic Object clone() throws CloneNotSupportedException{return super.clone();}}Student 类实现了接口,有克隆的方法。
3.clone()的深浅复制。
在一个类中,如果数据域全都是基本类型,无需考虑深浅复制。
如果数据域含有对象,则考虑深浅复制的问题了。
class Student implements Cloneable {
int number;
String name;
java.util.Date date;
@Overridepublic 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;@Overridepublic 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指向不同一个对象。
(如有错误,欢迎指正~)
2 0
- java clone和深度复制和浅复制的个人总结
- Java浅复制和深度复制 clone()
- 浅复制和深度复制 clone()
- 浅复制和深度复制 clone()
- Java的浅复制和深度复制
- Java中Clone方法的浅复制和深复制
- Java Object的clone方法浅复制和深复制
- 浅复制和深度复制 clone()Thinking in java 读书笔记(一)
- 浅复制和深度复制 clone()Thinking in java 读书笔记(一)
- 浅复制和深度复制 clone() Thinking in java 读书笔记(一)
- java浅复制和深度复制
- java深度复制和浅度复制
- Java深度复制和浅度复制
- java深度复制和浅度复制
- java深度复制和浅度复制
- java clone 中的浅复制和深复制
- java中的clone:深复制和浅复制
- Java中clone方法以及深复制和浅复制
- (ZT) cout打印不了函数地址
- Codeforces Round #335 (Div. 2) [补E]
- Java Socket(三) URL的应用
- 应用中的「确定」按钮应该在左边还是右边?
- bzoj1059[ZJOI2007]矩阵游戏
- java clone和深度复制和浅复制的个人总结
- mysql操作脚本总结
- 关于socket网络编程,各种报错若干总结
- 为方便管理Maven中的模块,Maven提供了聚合与继承来管理
- 同步与Java内存模型
- 共享DLL 和静态库DLL
- Java中时间相关函数Date、Calendar、SimpleDateFormat
- 两数交换
- 基于3D卷积神经网络的人体行为理解(论文笔记)