目录
万物之始,大道至简, 衍化至繁 --《道德经》
概念:
浅拷贝
结果分析:
深拷贝
万物之始,大道至简, 衍化至繁 --《道德经》
概念:
浅拷贝是拷贝了源对象的地址,任何源对象的任何值发生改变时,拷贝对象的值也会发生改变。
深拷贝只是拷贝了源对象的所有值而不是地址,所以即使源对象的值发生任何改变是,拷贝对象的值也不会改变。(新的对象 和原来的没有关系)
ps: 这里的深浅可以从变化程度来理解.
1)新老(source dest)还是有关联的叫浅拷贝。(地址不变)
2)新老(source dest)没有关联 拷完完全独立叫深拷贝。(地址变化)
浅拷贝
public class ShallowCopy {
public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student();
student.setAge(18);
student.setName("张三");
Teacher teacher = new Teacher();
teacher.setAge(28);
teacher.setName("王老师");
teacher.setStu(student);
Teacher teacher1 = new Teacher();
teacher1 = teacher;
System.out.println(">>>>>>>teacher" + teacher + ">>>>>>>teacher name" + teacher.getName() + ">>>>studentname" + teacher.getStu().getName());
System.out.println(">>>>>>>teacher1" + teacher1 + ">>>>>>>teacher1 name" + teacher1.getName()+ ">>>>studentname" + teacher1.getStu().getName());
}
}
class Teacher implements Cloneable{
@Getter
@Setter
private String name;
@Getter
@Setter
private Integer age;
@Getter
@Setter
private Student stu;
@Override
public Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
}
class Student{
@Getter
@Setter
private String name;
@Getter
@Setter
private Integer age;
}
运行结果:
结果分析:
上面的代码是引用的复制(地址的复制),两个对象都是一样。
变1
public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student();
student.setAge(18);
student.setName("张三");
Teacher teacher = new Teacher();
teacher.setAge(28);
teacher.setName("王老师");
teacher.setStu(student);
Teacher teacher1 = new Teacher();
teacher1 = teacher;
teacher1.setName("李四");
System.out.println(">>>>>>>teacher" + teacher + ">>>>>>>teacher name" + teacher.getName() + ">>>>studentname" + teacher.getStu().getName());
System.out.println(">>>>>>>teacher1" + teacher1 + ">>>>>>>teacher1 name" + teacher1.getName()+ ">>>>studentname" + teacher1.getStu().getName());
}
运行结果:
深拷贝
public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student();
student.setAge(18);
student.setName("张三");
Teacher teacher = new Teacher();
teacher.setAge(28);
teacher.setName("王老师");
teacher.setStu(student);
Teacher teacher1 = (Teacher)teacher.clone();
teacher1.setName("李四");
System.out.println(">>>>>>>teacher" + teacher + ">>>>>>>teacher name" + teacher.getName() + ">>>>studentname" + teacher.getStu().getName());
System.out.println(">>>>>>>teacher1" + teacher1 + ">>>>>>>teacher1 name" + teacher1.getName()+ ">>>>studentname" + teacher1.getStu().getName());
}
运行结果
分析:深拷贝地址变了 但是改变其中一个对象的值 另外一个不会发生变化。地址不一样其实就是一种隔离保护
变1:
public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student();
student.setAge(18);
student.setName("张三");
Teacher teacher = new Teacher();
teacher.setAge(28);
teacher.setName("王老师");
teacher.setStu(student);
Teacher teacher1 = (Teacher)teacher.clone();
student.setName("大哥大");
System.out.println(">>>>>>>teacher" + teacher + ">>>>>>>teacher name" + teacher.getName() + ">>>>studentname" + teacher.getStu().getName());
System.out.println(">>>>>>>teacher1" + teacher1 + ">>>>>>>teacher1 name" + teacher1.getName()+ ">>>>studentname" + teacher1.getStu().getName());
}
运行结果
结果分析
对象不一样了,对象里面的引用类型 没有完成深度拷贝,改变了一个其它都会跟着改变。
参考资料
https://blog.csdn.net/qq_34748010/article/details/124917704
https://blog.csdn.net/qq_40093255/article/details/115691423