深拷贝、浅拷贝都是特指对象间的一种行为,属于对象拷贝
对象拷贝和引用拷贝是两个概念!!
对象拷贝
引用拷贝
深拷贝和浅拷贝:
浅拷贝
将当前对象完全赋值一份,但注意对象中的属性如果有引用类型,则两个对象的引用类型指的是同一个空间。
如果是修改的基本数据类型,则通过另一个引用获取到的不会发生变化;
如果是修改的引用类型,则通过另一个引用获取到的也会发生变化;
而深拷贝则都不会发生变化,因为该对象中的引用类型也重新开辟了一个新的空间
深拷贝
浅拷贝和(直接)赋值:
赋值分为普通类型和引用类型:
普通类型就是直接的赋值,本身不存在地址
引用类型则是直接将当前的引用赋值过去,等同于浅拷贝?
完全不相等,赋值引用本质就是一个对象,同时被两个引用所指,属于引用拷贝;
而浅拷贝是通过当前对象又赋值出了一份对象在堆中
相关代码
类需要实现Cloneable接口【只是一种标记,代表可以被克隆】,否则会报错
同时类还需要重写Clone方法,因为Object中的Clone方法为Protected【重写方法的访问权限只能提高或者不变,不能降低,如不能从protected修改为private】
浅拷贝
深拷贝,同时引用属性的所在类也要被拷贝,即重写clone方法和实现Cloneable接口
小作业
以下情况引用类型为什么会被修改?
因为我们通过修改car属性是直接new了一个对象,它是直接在堆中开辟了一个新的空间,强行把我们拷贝出来的对象的car引用指向了另一个空间~~