gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-01-09 22:35:36 26 4
gpt4 key购买 nike

1、拷贝的引入



(1)、引用拷贝


创建一个指向对象的引用变量的拷贝.


                                                        
                                                           
                                                           Teacher teacher = new Teacher("Taylor",26); 
                                                        
                                                        
                                                           
                                                           Teacher otherteacher = teacher; 
                                                        
                                                        
                                                           
                                                           System.out.println(teacher); 
                                                        
                                                        
                                                           
                                                           System.out.println(otherteacher); 
                                                        
                                                      


输出结果:


                                                        
                                                           
                                                           blog.Teacher@355da254 
                                                        
                                                        
                                                           
                                                           blog.Teacher@355da254 
                                                        
                                                      


结果分析:由输出结果可以看出,它们的地址值是相同的,那么它们肯定是同一个对象。teacher和otherteacher的只是引用而已,他们都指向了一个相同的对象Teacher(“Taylor”,26)。这就叫做引用拷贝.


image.png


(2)、对象拷贝


创建对象本身的一个副本.


                                                        
                                                           
                                                           Teacher teacher = new Teacher("Swift",26); 
                                                        
                                                        
                                                           
                                                           Teacher otherteacher = (Teacher)teacher.clone(); 
                                                        
                                                        
                                                           
                                                           System.out.println(teacher); 
                                                        
                                                        
                                                           
                                                           System.out.println(otherteacher); 
                                                        
                                                      


输出结果:


                                                        
                                                           
                                                           blog.Teacher@355da254 
                                                        
                                                        
                                                           
                                                           blog.Teacher@4dc63996 
                                                        
                                                      


image.png


注: 深拷贝 和浅拷贝都是对象拷贝 。


2、浅拷贝



(1)、定义 。


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


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


(2)、浅拷贝实例 。

                                                        
                                                           
                                                           package com.test; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public class ShallowCopy { 
                                                        
                                                        
                                                           
                                                           public static void main(String[] args) throws CloneNotSupportedException { 
                                                        
                                                        
                                                           
                                                           Teacher teacher = new Teacher(); 
                                                        
                                                        
                                                           
                                                           teacher.setName("riemann"); 
                                                        
                                                        
                                                           
                                                           teacher.setAge(27); 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           Student2 student1 = new Student2(); 
                                                        
                                                        
                                                           
                                                           student1.setName("edgar"); 
                                                        
                                                        
                                                           
                                                           student1.setAge(18); 
                                                        
                                                        
                                                           
                                                           student1.setTeacher(teacher); 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           Student2 student2 = (Student2) 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("修改老师的信息后-------------"); 
                                                        
                                                        
                                                           
                                                           // 修改老师的信息 
                                                        
                                                        
                                                           
                                                           teacher.setName("Games"); 
                                                        
                                                        
                                                           
                                                           System.out.println(student1.getTeacher().getName()); 
                                                        
                                                        
                                                           
                                                           System.out.println(student2.getTeacher().getName()); 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           class Teacher implements Cloneable { 
                                                        
                                                        
                                                           
                                                           private String name; 
                                                        
                                                        
                                                           
                                                           private int age; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public String getName() { 
                                                        
                                                        
                                                           
                                                           return name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setName(String name) { 
                                                        
                                                        
                                                           
                                                           this.name = name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public int getAge() { 
                                                        
                                                        
                                                           
                                                           return age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setAge(int age) { 
                                                        
                                                        
                                                           
                                                           this.age = age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           class Student2 implements Cloneable { 
                                                        
                                                        
                                                           
                                                           private String name; 
                                                        
                                                        
                                                           
                                                           private int age; 
                                                        
                                                        
                                                           
                                                           private Teacher teacher; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public String getName() { 
                                                        
                                                        
                                                           
                                                           return name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setName(String name) { 
                                                        
                                                        
                                                           
                                                           this.name = name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public int getAge() { 
                                                        
                                                        
                                                           
                                                           return age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setAge(int age) { 
                                                        
                                                        
                                                           
                                                           this.age = age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public Teacher getTeacher() { 
                                                        
                                                        
                                                           
                                                           return teacher; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setTeacher(Teacher teacher) { 
                                                        
                                                        
                                                           
                                                           this.teacher = teacher; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public Object clone() throws CloneNotSupportedException { 
                                                        
                                                        
                                                           
                                                           Object object = super.clone(); 
                                                        
                                                        
                                                           
                                                           return object; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                      

输出结果:


                                                        
                                                           
                                                           拷贝后 
                                                        
                                                        
                                                           
                                                           edgar 
                                                        
                                                        
                                                           
                                                           18 
                                                        
                                                        
                                                           
                                                           riemann 
                                                        
                                                        
                                                           
                                                           27 
                                                        
                                                        
                                                           
                                                           修改老师的信息后------------- 
                                                        
                                                        
                                                           
                                                           Games 
                                                        
                                                        
                                                           
                                                           Games 
                                                        
                                                      


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


3、深拷贝



(1)、定义 。


深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大.


简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍.


(2)、深拷贝实例 。

                                                        
                                                           
                                                           package com.test; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public class DeepCopy { 
                                                        
                                                        
                                                           
                                                           public static void main(String[] args) throws CloneNotSupportedException { 
                                                        
                                                        
                                                           
                                                           Teacher2 teacher = new Teacher2(); 
                                                        
                                                        
                                                           
                                                           teacher.setName("riemann"); 
                                                        
                                                        
                                                           
                                                           teacher.setAge(27); 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           Student3 student1 = new Student3(); 
                                                        
                                                        
                                                           
                                                           student1.setName("edgar"); 
                                                        
                                                        
                                                           
                                                           student1.setAge(18); 
                                                        
                                                        
                                                           
                                                           student1.setTeacher(teacher); 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           Student3 student2 = (Student3) 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("修改老师的信息后-------------"); 
                                                        
                                                        
                                                           
                                                           // 修改老师的信息 
                                                        
                                                        
                                                           
                                                           teacher.setName("Games"); 
                                                        
                                                        
                                                           
                                                           System.out.println(student1.getTeacher().getName()); 
                                                        
                                                        
                                                           
                                                           System.out.println(student2.getTeacher().getName()); 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           class Teacher2 implements Cloneable { 
                                                        
                                                        
                                                           
                                                           private String name; 
                                                        
                                                        
                                                           
                                                           private int age; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public String getName() { 
                                                        
                                                        
                                                           
                                                           return name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setName(String name) { 
                                                        
                                                        
                                                           
                                                           this.name = name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public int getAge() { 
                                                        
                                                        
                                                           
                                                           return age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setAge(int age) { 
                                                        
                                                        
                                                           
                                                           this.age = age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public Object clone() throws CloneNotSupportedException { 
                                                        
                                                        
                                                           
                                                           return super.clone(); 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           class Student3 implements Cloneable { 
                                                        
                                                        
                                                           
                                                           private String name; 
                                                        
                                                        
                                                           
                                                           private int age; 
                                                        
                                                        
                                                           
                                                           private Teacher2 teacher; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public String getName() { 
                                                        
                                                        
                                                           
                                                           return name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setName(String name) { 
                                                        
                                                        
                                                           
                                                           this.name = name; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public int getAge() { 
                                                        
                                                        
                                                           
                                                           return age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setAge(int age) { 
                                                        
                                                        
                                                           
                                                           this.age = age; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public Teacher2 getTeacher() { 
                                                        
                                                        
                                                           
                                                           return teacher; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public void setTeacher(Teacher2 teacher) { 
                                                        
                                                        
                                                           
                                                           this.teacher = teacher; 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           public Object clone() throws CloneNotSupportedException { 
                                                        
                                                        
                                                           
                                                           // 浅复制时: 
                                                        
                                                        
                                                           
                                                           // Object object = super.clone(); 
                                                        
                                                        
                                                           
                                                           // return object; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           // 改为深复制: 
                                                        
                                                        
                                                           
                                                           Student3 student = (Student3) super.clone(); 
                                                        
                                                        
                                                           
                                                           // 本来是浅复制,现在将Teacher对象复制一份并重新set进来 
                                                        
                                                        
                                                           
                                                           student.setTeacher((Teacher2) student.getTeacher().clone()); 
                                                        
                                                        
                                                           
                                                           return student; 
                                                        
                                                        
                                                           
                                                           
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                        
                                                           
                                                           } 
                                                        
                                                      


输出结果:


                                                        
                                                           
                                                           拷贝后 
                                                        
                                                        
                                                           
                                                           edgar 
                                                        
                                                        
                                                           
                                                           18 
                                                        
                                                        
                                                           
                                                           riemann 
                                                        
                                                        
                                                           
                                                           27 
                                                        
                                                        
                                                           
                                                           修改老师的信息后------------- 
                                                        
                                                        
                                                           
                                                           Games 
                                                        
                                                        
                                                           
                                                           riemann 
                                                        
                                                      


结果分析:


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


关于Java深拷贝和浅拷贝区别,你学废了么?

  • 区别:如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用类型数据只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用类型数据进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。

问:clone()方法,是对当前对象进行浅拷贝,引用类型依然是在传递引用,那么,如何进行一个深拷贝呢?

  • 序列化这个对象,再反序列化回来,就可得到这个新的对象,无非就是序列化的规则需要自己来写。
  • 继续利用clone()方法,既然clone()方法是我们来重写的,实际上可以对其内的引用类型的变量,在进行一次clone()。

最后此篇关于Java的深拷贝和浅拷贝的区别的文章就讲到这里了,如果你想了解更多关于Java的深拷贝和浅拷贝的区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com