Java基础-深拷贝和浅拷贝的区别
深拷贝与浅拷贝
一般来说,拷贝的类型分为 深拷贝与浅拷贝。
|—————————————————————————————|
| 深拷贝:引用对象的值等信息,复制一份一样的。 |
| 浅拷贝:只复制引用,另一处修改,你当下的对象也会修改。 |
|—————————————————————————————|
网上有这样的描述,以上描述不科学
从字面上理解更好。
浅拷贝---拷贝的级别浅。
深拷贝---拷贝级别更深。
具体呢?
浅拷贝---能复制变量,如果对象内还有对象,则只能复制对象的地址
深拷贝---能复制变量,也能复制当前对象的 内部对象
代码范例
public class mytest {public static void main(String[] args) {Parent item1 = new Parent("john", 10);Parent item2 = item1.clone();System.out.println("parent1 = " + item1.toString());System.out.println("parent2 = " + item2.toString());}public static class Parent implements Cloneable{String name = "";int age = 0;Parent (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}@Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Parent[" + name + "===" + age + "];";}}
}
测试结果:
parent1 = Parent[john===10];
parent2 = Parent[john===10];
Parent1被复制了一份。
修改下main函数
再执行一次。
测试结果:
发现parent1被修改了,但是parent2并未收到影响。
再修改一下.
添加一个内部类son,并加到parent里头去。
public class mytest {。。。。。。。。 public static class Parent implements Cloneable{String name = "";int age = 0;Son theson;Parent (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}public void setSon(Son s) {theson = s;}@Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Parent[" + name + "===" + age + "];" + "---Son:"+ (theson != null ? theson.name : "null");}}public static class Son implements Cloneable {String name = "";int age = 0;Son (String n, int age){this.name = n;this.age = age;}public void setName(String na) {name = na;}@Overrideprotected Son clone() {Son clone = null;try {clone = (Son) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}return clone;}public String toString() {return "Son[" + name + "===" + age + "];";}}
}
<span style="mso-spacerun:'yes';font-family:Calibri;mso-fareast-font-family:宋体;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;">
</span>
看main的修改
先copy再设置。
测试结果:
可以看到parent1与parent2中的son都变了。
可见,浅拷贝---只是将 内部对象的地址保存。。。。
最后,修改一下Clone
@Overrideprotected Parent clone() {Parent clone = null;try {clone = (Parent) super.clone();} catch (CloneNotSupportedException e){throw new RuntimeException(e); // won't happen}clone.theson = theson.clone();return clone;}
测试结果:
parent1 = Parent[alice-john===10];---Son:alice---john's son
parent2 = Parent[john===10];---Son:john'son<span style="mso-spacerun:'yes';font-family:宋体;mso-ascii-font-family:Calibri;mso-hansi-font-family:Calibri;mso-bidi-font-family:'Times New Roman';font-size:10.5000pt;mso-font-kerning:1.0000pt;"> </span>
结果达到了我预计的结果。。。
小结
浅拷贝与深拷贝,一字之差,主要表明了拷贝的层次差别。
Object的clone方法,必须要实现Cloneable。
表明了,clone方法的实现要程序员自己来。。。
而深浅拷贝只是术语的区别。。。你怎么实现的就是怎么个定义。
1. 必须实现Cloneable
2. 要深拷贝,得注意对象的内部对象,也需要clone
Java基础-深拷贝和浅拷贝的区别相关推荐
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...
- java -- 深拷贝和浅拷贝的区别 如何实现深拷贝和浅拷贝
文章目录 1. 深拷贝和浅拷贝的区别 1.1 浅拷贝实例 1.1.1 测试1 直接赋值 1.1.2 测试2 改变源对象的值 1.2 深拷贝实例 `这是用于深拷贝的测试类` 1.2.1 方法一: 构造函 ...
- 学习Java的深拷贝和浅拷贝
关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...
- 如何完美解答面试问题——深拷贝和浅拷贝的区别
大家好,我是孤焰.今天要谈一谈在面试过程中可能被面试官提到的一个问题--深拷贝和浅拷贝的区别? 由于我也是刚刚学习编程的小白,所以此篇博文将参考了多篇博文,最后总结而成. 最近由于多门考试临近,所以博 ...
- python 深拷贝_详解python的复制,深拷贝和浅拷贝的区别
概述 今天主要来看看Python中的浅拷贝和深拷贝内容,这里用一个实例来说明~ 需求: 将一个列表的数据复制到另一个列表中. 思路: 使用列表[:],拿不准可以调用copy模块. 实现方法: #!/u ...
- c++深拷贝和浅拷贝的区别?
c++深拷贝和浅拷贝的区别 浅拷贝 深拷贝 总结 浅拷贝 对一个已知对象进行拷贝,编译系统会自动调用一种构造函数--拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数,调用一次构造函数 ...
- Python中深拷贝与浅拷贝的区别?
往期面试题: 列举Python中的标准异常类? 说说Python面向对象三大特性? 说说Python中有几种数据类型? 说说Python模块主要分哪三类? 废话不多说,开始今天的题目: 问:说说Pyt ...
- Java基础之equals和==的区别深入解析
Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...
最新文章
- java纳税服务_纳税服务系统【总结】
- 分位数(quantiles)、Z-score 与 F-score
- C#菜鸟正则表达式一
- java中链式调用_Java及Android中常用链式调用写法简单示例
- oracle 连接greenplum,Oracle通过DBLINK访问GreenPlum
- MySql实战篇:写一个简单的存储过程,完成订单定时任务
- client-error-not-possible Ubuntu连接局域网打印机
- Egyptian Collegiate Programming Contest (ECPC 2015)
- 猎人网吧的游戏更新VBS(转)
- gitee代码管理仓库管理代码,更简单地查看各阶段的代码变动
- 用PPT做的微信红包封面还可以这么玩?
- the connection to the server was unsuccessful(file ///android_asset/www/index.html)
- 【汽车安全】ISO26262概要
- gige相机二次开发_GigE Vision接口摄像机及其应用
- 淘宝直通车的打法的方法与问题分析
- 第十三周 任务二
- Kafka创建Topic出现replication factor: 2 larger than available brokers: 0 减少replication factor还是出现错误的解决办法
- PointNet 学习笔记
- 读敏捷系列之《The Art of Agile Development》
- 南京大学计算机夏博士,凌盛杰