在 Java 中,拷贝(复制对象)有三种方式:浅拷贝、深拷贝和引用拷贝。它们之间的区别主要在于拷贝的程度和拷贝后对象之间的关系。
-
浅拷贝(Shallow Copy):
- 浅拷贝会创建一个新对象,但是这个新对象中的基本数据类型字段会被复制,而引用数据类型字段则只会复制引用,而不是实际的对象。也就是说,浅拷贝后的对象和原始对象中的引用数据类型字段指向相同的对象。
- 浅拷贝只是简单地复制了对象中的字段,因此如果对象中包含引用类型的成员变量,那么浅拷贝后的对象和原始对象共享这些引用类型的成员变量。
- 使用 Object 类的 clone() 方法可以实现浅拷贝。
-
深拷贝(Deep Copy):
- 深拷贝会创建一个新对象,并且递归地复制所有引用类型字段指向的对象,而不是简单地复制引用。这样,深拷贝后的对象和原始对象中的引用数据类型字段将指向不同的对象实例。
- 深拷贝会完全复制对象及其所有子对象,因此不会共享任何对象。
- 实现深拷贝的方法有多种,可以通过序列化、手动递归复制等方式来实现。
-
引用拷贝(Reference Copy):
- 引用拷贝并不是真正的拷贝,而是将原始对象的引用赋值给另一个对象变量。这样,这两个对象变量指向同一个对象实例,它们共享相同的对象。
- 修改一个对象的成员变量会影响到另一个对象,因为它们指向同一个对象实例。
- 引用拷贝常见于对类实例的赋值操作。
总的来说,区别主要在于拷贝后对象内部数据的关系:
- 浅拷贝会共享引用数据类型的成员变量;
- 深拷贝会完全复制对象及其所有子对象,不会共享任何对象;
- 引用拷贝会共享同一个对象实例。