Java中浅拷贝和深拷贝的区别

Java中浅拷贝和深拷贝的区别

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java中浅拷贝和深拷贝的区别,希望能够帮助大家进步!!!

浅拷贝和深拷贝的定义:
浅拷贝:
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:
深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
 

Teacher teacher = new Teacher();
teacher.name = "原老师";
teacher.age = 28;

Student student1 = new Student();
student1.name = "原学生";
student1.age = 18;
student1.teacher = teacher;

Student student2 = (Student) student1.clone();
System.out.println("-------------拷贝后-------------");
System.out.println(student2.name);
System.out.println(student2.age);
System.out.println(student2.teacher.name);
System.out.println(student2.teacher.age);

System.out.println("-------------修改老师的信息后-------------");
// 修改老师的信息
teacher.name = "新老师";
System.out.println("student1的teacher为: " + student1.teacher.name);
System.out.println("student2的teacher为: " + student2.teacher.name);
class Teacher implements Cloneable {
    public String name;
    public int age;
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
class Student implements Cloneable {
    public String name;
    public int age;
    public Teacher teacher;
    public Object clone() throws CloneNotSupportedException {
        // 浅复制时:
//        return super.clone();

        // 深复制时:
        Student student = (Student) super.clone();
        // 本来是浅复制,现在将Teacher对象复制一份并重新赋值进来
        student.teacher = (Teacher) this.teacher.clone();
        return student;
    }
}

浅拷贝>输出结果:

-------------拷贝后-------------
原学生
18
原老师
28
-------------修改老师的信息后-------------
student1的teacher为: 原老师
student2的teacher为: 原老师

结果分析:
两个引用student1和student2指向不同的两个对象,但是两个引用student1和student2中的两个teacher引用指向的是同一个对象,所以说明是"浅拷贝"。
 


深拷贝>输出结果:

 

-------------拷贝后-------------
原学生
18
原老师
28
-------------修改老师的信息后-------------
student1的teacher为: 新老师
student2的teacher为: 原老师

结果分析:
两个引用student1和student2指向不同的两个对象,两个引用student1和student2中的两个teacher引用指向的是两个对象,但对teacher对象的修改只能影响student1对象,所以说明是"深拷贝"。

本文来源huayang183,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/17949

发表评论