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
原创粉丝点击