拷贝总结
深拷贝、浅拷贝、延迟拷贝
JAVA中类型存放
在Java中,数据的类型可以分为基本类型(值类型)和引用类型
- 基本类型:boolean类型与数值类型
- 数值类型:byte short int long char(特殊的int) float double
- 引用类型:null、class、array、interface、String、枚举
这两种类型有什么区别呢?

在JAVA中,我们简单的先了解内存是由两部分组成:堆和栈
- 堆用来存放引用类型的值
- 栈用来存放基本类型的值和引用类型的引用(对象)
对于基本类型来说,值就直接保存在变量中,存储在栈
(PS:JAVA中基本对象时单个值,不是对象,不面向对象。但基本对象也有包装器是基本类型的对象)
对于引用类型来说,变量中保存的是对象的地址,由地址再指向实际的对象,实际对象保存着内容
当我们清楚了解了这个以后,我们再去看看赋值“=”
- 基本类型的赋值:
1 | int num =20; |
对于基本类型的赋值来说,赋值运算会直接改变变量的值,原来的值被覆盖
- 引用类型的赋值:
1 | String str=new String("Hello"); |
对于引用类型来说,原来的”Hello”字符串对象并没有改变,我只会去指向JAVA
但原来的怎么处理,我们在JAVA中有一套垃圾处理机制,对于没有任何引用指向的对象就是被认为是垃圾,所以会被处理回收
下面我们将介绍一下对象拷贝:深拷贝、浅拷贝、延迟拷贝
对象拷贝是指将一个对象的属性拷贝到另一个有着相同类型的对象中去
浅拷贝
浅拷贝是按位拷贝对象
如果是基本类型,拷贝就是拷贝基本类型的值
如果是引用类型,拷贝的就是内存地址。
结论:在浅拷贝中如果一个对象改变了这个地址,就会影响
我们一般用object类的clone方法来实现浅拷贝。但是要实现浅拷贝必须要继承Cloneable接口并且重写
具体一点:浅拷贝是创建一个新对象,然后将当前对象的非静态字段复制到新对象,如果字段是值类型的,那么对该字段执行赋值;如果该字段是引用类型的话,则复制引用但不复制引用的对象。所以原始对象和其副本引用的是同一个对象
- 代码实现:
1 | public class Person implements Cloneable{ |
深拷贝
- 深拷贝拷贝了对象的值都会有变化

上面这幅图很好的说明了深拷贝和浅拷贝的区别
深拷贝拷贝的是所有对象,也就是对象的地址和值。所以改变源对象,拷贝对象值不会发生改变
具体方法有很多,我在后面会慢慢总结
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.