Java中的浅克隆和深克隆
深克隆和浅克隆的区别:
被克隆的类需要实现Clonenable标记接口,重写父类Object类中的方法clone。
浅克隆: 浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深克隆: 深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
代码演示:
/*** 学生类*/
public class Student implements Cloneable {private String name;private int age;//重写Object类的方法clone@Overridepublic Object clone() throws CloneNotSupportedException {Student student = (Student) super.clone();return student;}public Student() {super();}public Student(String name, int age) {this.name = name;this.age = 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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
/*** 老师类*/
public class Teacher implements Cloneable{private String name;private int age;private Student student;public Teacher(String name, int age, Student student) {this.name = name;this.age = age;this.student = student;}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 Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +", student=" + student +'}';}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}
/*** 测试浅克隆*/
public class TestClone {public static void main(String[] args) throws CloneNotSupportedException {//创建Person类对象并复制一份Teacher teacher1 = new Teacher("王老师", 36, new Student("张三",15));Teacher teacher2 = (Teacher) teacher1.clone();Student student = teacher2.getStudent();//修改浅克隆出来的老师的学生成员变量的值//源老师的成员变量学生的值也被改变student.setAge(5);student.setName("小杨");System.out.println(teacher1);System.out.println(teacher2);}
}
执行结果:
深克隆的时候就要把克隆的对象中的引用类型的成员再克隆一次。
&emso; 再次修改上面的 Teacher 类重写父类Objcet的方法clone:
代码:
@Overridepublic Object clone() throws CloneNotSupportedException {Teacher teacher = (Teacher) super.clone();//把引用类型的变量在克隆一份teacher.setStudent((Student) teacher.getStudent().clone());return teacher;}
再次执行测试类的执行结果:
这次修改克隆的Teacher类的变量的值,源Teacher的值就不再受影响了。
Java中的浅克隆和深克隆相关推荐
- Java中的浅克隆与深克隆
Java中的浅克隆与深克隆 一:前言 二:浅克隆与深克隆的区别 一:前言 克隆,即复制一个对象,该对象的属性与被复制的对象一致,如果不使用Object类中的clone方法实现克隆,可以自己new出一个 ...
- 详细分析Java中的浅克隆和深克隆
本文对浅克隆和深克隆的两种方法(不引入别的开源工具)进行了简单的代码实现(没有内部类语法),对比了浅克隆和深克隆对引用类型的影响,暂不考虑不可变类,确保初学Java者能够看懂并学会,可直接复制源代码进 ...
- Java对象克隆——浅克隆和深克隆的区别
在Java中对象的克隆有深克隆和浅克隆之分.有这种区分的原因是Java中分为基本数据类型和引用数据类型,对于不同的数据类型在内存中的存储的区域是不同的.基本数据类型存储在栈中,引用数据类型存储在堆中. ...
- java对象的浅克隆和深克隆
引言: 在Object基类中,有一个方法叫clone,产生一个前期对象的克隆,克隆对象是原对象的拷贝,由于引用类型的存在,有深克隆和浅克隆之分,若克隆对象中存在引用类型的属性,深克隆会将此属性完全拷贝 ...
- Java中的深克隆和浅克隆的原理及三种方式实现深克隆
本文详细介绍了Java中的浅克隆和深克隆的概念,及案例演示如何实现深克隆! 文章目录 1 克隆概述 2 深克隆实现 3 案例 3.1 测试普通clone方法--浅克隆 3.2 使用重写后的clon ...
- 浅析Java中的深克隆和浅克隆
说实话,目前为止还没在项目中遇到过关于Java深克隆和浅克隆的场景.今天手抖戳开了花呗账单,双十二败家的战绩真是惨不忍睹,若能在我的客户端"篡改"下账单金额,那该(简)有(止)多( ...
- 【重难点】【Java基础 06】浅克隆与深克隆、Object类的常用方法、util包下的接口
[重难点][Java基础 06]浅克隆与深克隆.Object对象的常用方法.util包下的接口 文章目录 [重难点][Java基础 06]浅克隆与深克隆.Object对象的常用方法.util包下的接口 ...
- Java中对象的深克隆和浅克隆
2019独角兽企业重金招聘Python工程师标准>>> 浅克隆和深克隆的概念 浅克隆:被克隆的对象里的所有变量值都与原来的对象相同,而所有对其他对象的引用仍然指向原来的对象.简而言之 ...
- Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- java中浅克隆与深克隆解析
文章目录 简介 浅克隆 深克隆 嵌套使用clone()方法 序列化方式 浅克隆和深克隆的比较 简介 所谓克隆,就是指依照已存在的数据,复制出一份一样的数据. java中的克隆有浅克隆和深克隆之分,造成 ...
最新文章
- [angularjs] angularjs系列笔记(四)控制器
- firefox设置代理服务器
- redis:消息发布与订阅频道
- Logisim 一个PLA电路
- Apache Mahout:入门
- 【Kattis - triangle 】Sierpiński Circumference(数学,求位数,取对数或Java)
- Ubuntu下安装最新版QQ
- 5场直播丨PostgreSQL、openGauss、Oracle、GoldenDB、EsgynDB
- MyBatis框架parameterType为哈希类型的别名映射和resultMap映射
- VB直接播放EXE文件中的声音文件
- 阿里OSS对象存储,实现图片上传进度显示ProgressListener;
- bzoj2783: [JLOI2012]树
- micropython按键控制流水灯_【MicroPython】LAB01 - 流水灯
- 1小时教你理解HTTP,TCP,UDP,Socket,WebSocket
- 使用python做一个翻译工具
- 西瓜创客_西瓜创客_西瓜创客下载安装_西瓜创客app安卓版下载_好趣手游网
- linux ls 配色方案,Terminal 配色方案
- tortoise git 冲突解决
- EFFECTIVE C++ (万字详解)(一)
- 小技巧——网页下载提速
热门文章
- iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码
- 20170831_安装软件
- sublime test3 安装及配置
- 一个容易失误的字符串转字符问题
- mfc中句柄与指针的区别
- 计算机科学现代教育,现代教育技术教程-计算机科学教育.pdf
- 火星开发的价值_发现“火星”岩石密度比预想更低,火星探测开发的“九大价值”...
- 腾讯云 python接口_python调用腾讯云短信接口
- 【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化
- 拓端tecdat|R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长