- 直接赋值复制:
理解:两个相同的类对象赋值的话,复制的是引用,如将 a2 赋值给 a1(A a1 = a2),则两个变量指向同一个对象,所以当 a1 变化时,a2 也会变化;反之当 a2 变化时,a1 也会变化。
- 浅拷贝:
理解:创建一个新对象,将当前对象的非静态字段复制到该新对象,如果是基本数据类型,复制值;如果是引用数据类型,复制引用但不复制引用的对象即两个对象的地址指向的是同一个地址。
- 深拷贝:
理解:深拷贝复制的不只是对象本身,还有对象包含的引用指向的所有对象,即创建一个相同的对象,但两个对象是单独分开的,各自指向各自的地址。
- 内存四大组成部分:栈区、堆区、全局 / 静态区、只读区
- 栈区:
存放数据:局部参数、形参
- 堆区:
存放数据:new 出来的数据
- 全局 / 静态区:
存放数据:全局变量和静态变量
- 只读区:
存放数据:常量
总结:
浅拷贝:复制引用但不复制引用的对象(也就是简单的把栈中的引用地址拷贝了一份,当修改新拷贝的值的时候,被拷贝的对象也会被修改)
实现:正常的赋值就是浅拷贝。
深拷贝:复制引用并且复制引用的对象(深拷贝的话会在堆内存中为新对象建立空间,也就是两个对象拥有各自的地址。)
实现:最常用的是使用递归的方式实现,也可以使用 JSON、Object.assgin、MessageChannel 实现