我们并不希望在编程中遇到浅拷贝,那么,怎么做到深拷贝呢
浅拷贝,也就是在拷贝构造中存在引用赋值,出现捆绑现象,而捆绑会使我们的数据出现一系列的问题
比如这里有一个Person类:
public class Person {
private String name;
private MyDate birth;
public Person(String name, MyDate birth) {
this.name = name;
this.birth = birth;
}
/*//方法1
public Person( Person p){
this.name = p.name; //基本数据类型,值拷贝
this.birth = p.birth; //☆引用赋值必捆绑 --地址拷贝
}*/
//方法2
public Person( Person p){
this.name = p.name; //基本数据类型,值拷贝
this.birth = new MyDate(p.birth); //☆引用赋值必捆绑 --地址拷贝
}
}
Person需要一个MyDate类:
public class MyDate {
private int year;//年
private int month;//月
private int day;//日
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public MyDate() {
this(1970,1,1);
}
public MyDate(MyDate d) {
this(d.year,d.month,d.day);
}
}
当我们使用方法1的使用会出现捆绑现象,而使用方法2就不会
如果拷贝的内容含有对象,那么就会出现捆绑,我先前也有写过关于引用赋值必捆绑的博文
这里再上一张图来讲解:
当我们拷贝一个对象的时候,需要一直深入到每一个对象的基本数据类型,方法是拷贝的时候new一个对象,具体可以再斟酌上面的代码