当前位置: 首页 > web >正文

浅拷贝和深拷贝的区别

        Person p1 = new Person(10);Person p2 = p1;p2.age = 20;System.out.println(p1=p2); // trueSystem.out.println(p1.age); // 20

这种做法只是复制了对象的地址,即两个变量现在是指向了同一个对象,任意一个变量,操作了对象的属性,都会影响到另一个变量
 

这中对同一个对象操作,当然算不上真正的复制,所以引用拷贝并不算对象拷贝,所谓的对象拷贝一般就是指浅拷贝和深拷贝

浅拷贝

在java中Object提供了一个clone()方法,看名字就是它和对象拷贝有关,该方法访问修饰符为protected,如果子类不重写该方法,并将其声明为public,那外部就调用不了,对象的clone().

class Person implements Cloneable {public int age;public Person(int age) {this.age = age;}@Overridepublic Person clone() {try {return (Person) super.clone();  } catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

子类在重写时直接调用Object的clone()即可,它是native方法,底层实现了拷贝对象的逻辑,注意子类一定得实现Cloneable接口,否则调用clone()时,会抛出异常,这是java的规定。

        Person p1 = new Person(10);Person p2 = p1;p2.age = 20;System.out.println(p1=p2); // falseSystem.out.println(p1.age); // 10

现在我们调用clone()方法来实现,发现两个变量指向的已经是不同的对象各自改属性,也不会影响到另一个对象,看起来效果很好。

不过有一个问题,如果拷贝对象中有属性是引用类型,那这种浅拷贝的方式,只会复制该属性的引用地址,即拷贝对象和原对象的属性,都指向了同一个对象,如果对这个属性进行一些操作,则会影响到另一个对象的属性,若想将对象中的引用类型属性也进行拷贝,那就得用深拷贝了。

深拷贝

class Person implements Cloneable {public int age;public int[] arr = new int[]{1,2,3}public Person(int age) {this.age = age;}@Overridepublic Person clone() {try {Person person = (Person) super.clone();  person.arr = this.arr.clone();return perosn;} catch (CloneNotSupportedException e) {throw new RuntimeException(e);}}
}

我们将clone()方法稍微修改一下,clone()出对象之后,我们再对对象的属性,进行一次拷贝。

这样就完成了属性的复制,此时对象中的属性也指向了不同的对象实例。

总结

引用拷贝只是复制对象的地址,并不会创建一个新的对象

浅拷贝会创建一个对象,并进行属性的复制,不过对引用类型的属性,只会复制其对象地址

深拷贝则是完全复制整个对象,包括引用类型的属性

都是通过clone(),在实际开发中,不建议大家使用该方法,因为他有抛出异常的风险,如果真的想让对象提供拷贝功能,可以自己编写其他方法来实现

http://www.xdnf.cn/news/3942.html

相关文章:

  • Android控件View、ImageView、WebView用法
  • 14.网络钓鱼实战
  • 【论文阅读】DETR+Deformable DETR
  • 【现代深度学习技术】现代循环神经网络07:序列到序列学习(seq2seq)
  • [学成在线]23-面试题总结
  • AIGC学术时代:DeepSeek如何助力实验与数值模拟
  • 基于PPO的自动驾驶小车绕圈任务
  • Photo-SLAM论文理解、环境搭建、代码理解与实测效果
  • Kubernetes 虚拟机安全关机操作流程
  • 生成式AI服务内容被滥用的法律责任划分
  • Matlab实现CNN-BiLSTM时间序列预测未来
  • 进程间通信——管道
  • Paramiko 核心类关系图解析
  • Android Compose 中 CompositionLocal 的全面解析与最佳实践
  • ARM介绍及其体系结构
  • 【Linux我做主】进度条小程序深度解析
  • 浅析AI大模型为何需要向量数据库?【入门基础】
  • 2021年第十二届蓝桥杯省赛B组Java题解
  • KaiwuDB X 遨博智能 | 构建智能产线监测管理新系统
  • Python推导式:简洁高效的数据处理利器
  • PCB实战篇
  • Java 基础语法篇
  • 编程学习思考
  • 基于多策略混合改进哈里斯鹰算法的混合神经网络多输入单输出回归预测模型HPHHO-CNN-LSTM-Attention
  • BUCK电路制作负电源原理
  • Linux网络:bond简介与配置
  • AVL树(2):
  • 0.1 数学错题---基础
  • 嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)
  • chrome 浏览器怎么不自动提示是否翻译网站