Java 的浅拷贝与深拷贝详解

先讲一讲Java 中equals() 和==的区别

1. 基本数据类型(byte,short,char,int,long,float,double,boolean)

双等号(==)和 equals ,比较的是他们的值。

2. 类

当使用==比较的是两个对象的内存地址

当时用equals比较的也是内存地址 ,因为Object类中的equals方法就是用==比较的

在这里插入图片描述


什么是浅拷贝?什么是深拷贝?

一般对于类而言
深拷贝: 对基本数据类型进行值传递,对引用数据类型,创建一个新的,对其进行赋值。(两个指针指向不同的内存单元)
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用(类似C 中的指针,等于两个指针指向同一个内存单元)

​ 比如:

​ 当使用浅拷贝中的clone
在这里插入图片描述

在这里插入图片描述

​ 测试结果如下,f1与f2中的成员变量并不相等。

在这里插入图片描述

​ 所以说如果要深拷贝必须将所有的成员变量都进行clone

在写浅拷贝和深拷贝之前,还需要了解Java中的Clone

在这里插入图片描述

可以看到如果类没有实现Cloneable接口就会报错,如果实现了就调用 internalClone() , internalClone() 这个方法会返回一个这个类的一个新实例。

所以说如果一个类需要调用Clone(), 那么这个了类需要实现Cloneable 接口
在这里插入图片描述

Cloneable 接口 只起到一个标识作用,表明这个类需要用到Clone()方法。

如何进行浅拷贝?如何进行深拷贝

浅拷贝

​ 如图中的clone()方法 ,这就实现了浅拷贝

​ 首先,这个类中有一个名为SonObject的子类。并且FatherObject 实现了Cloneable接口,并且Clone() 方法调用了Object中的Clone()方法。

深拷贝

​ 实现浅拷贝有两种方法,一种是利用Object中的Clone() ,一种是将类序列化然后再反序列化.

1. 利用Object中的clone()
​	图中实现了深拷贝的clone

在这里插入图片描述

2. 先序列化,反序列化
   网络上的列子挺多的,这里就不详细描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值