美文网首页
Java深浅拷贝

Java深浅拷贝

作者: 卡路fly | 来源:发表于2020-05-19 22:59 被阅读0次

浅拷贝

浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象

package Pattern;

public class Solution {
    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher teacher = new Teacher();
        teacher.setName("老师");
        teacher.setAge(40);

        Student student1 = new Student();
        student1.setName("学生1");
        student1.setAge(18);
        student1.setTeacher(teacher);

        Student student2 = (Student) student1.clone();
        System.out.println("拷贝后");
        System.out.println(student2.getName());
        System.out.println(student2.getAge());
        System.out.println(student2.getTeacher().getName());
        System.out.println(student2.getTeacher().getAge());

        System.out.println("更改学生1年纪---------------");
        student1.setAge(30);
        System.out.println(student1.getAge());
        System.out.println(student2.getAge());

        System.out.println("修改老师的信息后-------------");
        teacher.setName("新老师");
        System.out.println(student1.getTeacher().getName());
        System.out.println(student2.getTeacher().getName());

    }
}

class Teacher implements Cloneable {
    private String name;
    private int age;
    ...
    get,set
    ...
}

class Student implements Cloneable {
    private String name;
    private int age;
    private Teacher teacher;
    ...
    get,set
    ...
    public Object clone() throws CloneNotSupportedException {
        // 浅拷贝
        return super.clone();
    }
}

输出结果

拷贝后
学生1
18
老师
40
更改学生1年纪---------------
30
18
修改老师的信息后-------------
新老师
新老师

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

深拷贝

  • 深拷贝把要复制的对象所引用的对象都复制了一遍。
  • 深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
public class Solution {
    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher teacher = new Teacher();
        teacher.setName("老师");
        teacher.setAge(40);

        Student student1 = new Student();
        student1.setName("学生1");
        student1.setAge(18);
        student1.setTeacher(teacher);

        Student student2 = (Student) student1.clone();
        System.out.println("拷贝后");
        System.out.println(student2.getName());
        System.out.println(student2.getAge());
        System.out.println(student2.getTeacher().getName());
        System.out.println(student2.getTeacher().getAge());

        System.out.println("更改学生1年纪---------------");
        student1.setAge(30);
        System.out.println(student1.getAge());
        System.out.println(student2.getAge());

        System.out.println("修改老师的信息后-------------");
        teacher.setName("新老师");
        System.out.println(student1.getTeacher().getName());
        System.out.println(student2.getTeacher().getName());

    }
}

class Teacher implements Cloneable {
    private String name;
    private int age;

       ...
    get,set
    ...
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Student implements Cloneable {
    private String name;
    private int age;
    private Teacher teacher;

       ...
    get,set
    ...

    public Object clone() throws CloneNotSupportedException {
        // 浅拷贝
//        return super.clone();

        // 深拷贝:
        Student student = (Student) super.clone();
        // 将Teacher对象复制一份并重新set进来
        student.setTeacher((Teacher) student.getTeacher().clone());
        return student;
    }
}
}

结果

拷贝后
学生1
18
老师
40
更改学生1年纪---------------
30
18
修改老师的信息后-------------
新老师
老师

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


整理自:https://blog.csdn.net/riemann_/article/details/87217229

相关文章

  • Java深浅拷贝

    浅拷贝 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象 输出结果 两个引用student1和student2指...

  • Java 深浅拷贝

    浅拷贝定义: 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的...

  • Java 最近遇到的面试题

    JAVA 基础 java 对象拷贝深浅拷贝 对象何时进入老年代 Minor GC 和 Full GC 有什么不同 ...

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • (13)Java深浅拷贝

    引用拷贝(一个人,不同名字) 浅拷贝(双胞胎):创建对象,将目标对象内容复制过来,不直接拷贝引用 深拷贝:全独立原...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • Java中创建对象的方式

    一:Java中创建对象的方式 示例 注:同步更新于CreateObjectTest 二:Java的深浅拷贝 三:如...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • Python—浅拷贝与深拷贝

    浅拷贝 深拷贝 深浅拷贝的作用

  • 深浅拷贝

    先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;基本类型:Underfied Null...

网友评论

      本文标题:Java深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/gqniohtx.html