Java中对象如何拷贝?

⭐专栏介绍

本专栏会持续更新各种关于JAVA的问题,包括面试题,JAVA入门到精通等。

更新速度保持在每天3—5篇

在这里插入图片描述

Java中对象如何拷贝?

在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝

与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时

,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以

即使源对象的值发生变化时,拷贝对象的值也不会改变。

在这里插入图片描述

一、浅拷贝clone()

Java中对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。

例如:对象A和对象B都属于类S,具有属性a和b。那么对对象A进行拷贝操作赋值给对象B

就是:

B.b = A.a;
B.b = A.a;

对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性复制一份给新的对象。因为是两份不同的数据,所以对其中一的对象的成员变量值进行修改,不会影响另一个对象拷贝得到的数据。
对于数据类型是引用类型的成员变量,比如说成员变量是某个数组,某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用指(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。

二、深度拷贝

不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,知道该对象可达的所有对象。也就是说,对象进行深拷贝要对整个对象图进行拷贝,简单的说,深拷贝对引用数据类型的成员变量的对象图中所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。

三、序列化可克隆(深拷贝)

序列化就是将对象写到流中的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流中将其读出来,即可实现深拷贝。需要注意的是序列化对象的类必须实现Serializable接口,否则无法实现序列化操作。

猜你喜欢

转载自blog.csdn.net/weixin_50843918/article/details/132889914