- 直接赋值
- 没有产生新的对象,只是给对象新增一个对象的引用
- 例如:Person p1= new Person(); Person p2 = p1 ; 就是直接赋值
- 浅克隆(浅拷贝)
- 首先被克隆对象需要实现 Cloneable 接口 ,然后重写clone方法
- 注意clone方法的访问修饰符默认是 protected
- 结论:
- 对象的成员属性是基础数据类型和基础数据类型包装类型以及String会直接复制一份在堆里面(A修改,B不会被影响),
- 但是如果是成员属性是引用类型,那么只会复制对象的引用(也就是同一片内存用两个引用指向它,A修改B也会受到影响,因为修改的同一块内存数据)
- 代码样例:
- 首先被克隆对象需要实现 Cloneable 接口 ,然后重写clone方法
- 深克隆(深拷贝)
- 对象的成员属性,不管是什么类型的,都会被重新复制一份,原对象和复制对象之间完全独立。
- 实现方式:
- 方式一(太麻烦):所有对象都去实现Clone接口,且都重写clone()方法,然后再被克隆对象的clone()方法中逐个调用
- 方式二:利用 Serializable 将对象序列化为流
- 方式二代码截图:
调用截图: