在Java中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)也叫深复制和浅复制,是两种不同的对象复制
方式,它们的主要区别在于复制对象时是否复制对象内部的引用
,也就是是否在拷贝副本之后,对象内的引用变量指向的还是同一块堆空间。
1. 浅拷贝
浅拷贝是指只复制对象本身
及其内部的基本数据类型
字段,而不复制对象内部的引用类型字段,所以浅拷贝后的对象和原始对象共享
引用类型字段指向的对象,即修改其中一个对象的引用类型字段会影响另一个对象。
代码如下:
class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
private String city;
public Address(String city) {
this.city = city;
}
}
public class ShallowCopyExample {
public static void main(String[] args) {
Address address = new Address("New York");
Person person1 = new Person("Alice", address);
try {
Person person2 = (Person) person1.clone();
System.out.println("Original Person: " + person1.address.city);
System.out.println("Cloned Person: " + person2.address.city);
// 修改原始对象的地址
person1.address.city = "Los Angeles";
System.out.println("Original Person after modification: " + person1.address.city);
System.out.println("Cloned Person after modification: " + person2.address.city);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
在上面的代码中,创建了一个 Person 类和一个 Address 类, Person 类包含一个 Address 类型的字段。在 main 方法中,我们对 person1 进行了浅拷贝得到 person2 ,然后修改了 person1 的 address 字段,发现 person2 的 address 字段也被修改了。
2. 深拷贝
深拷贝是指不仅复制对象本身,还复制对象内部的所有引用类型字段,使得复制后的对象和原始对象完全独立
,互不影响。 深拷贝一般需要通过序列化、反序列化
(对于序列化可以看博主的另一篇博文 Java中的序列化和反序列化详解!!! )或手动递归复制来实现。
手动实现深拷贝代码如下:
class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
@Override
public Object clone() throws CloneNotSupportedException {
Person clonedPerson = (Person) super.clone();
clonedPerson.address = (Address) address.clone();
return clonedPerson;
}
}
class Address implements Cloneable {
private String city;
public Address(String city) {
this.city = city;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class DeepCopyExample {
public static void main(String[] args) {
Address address = new Address("New York");
Person person1 = new Person("Alice", address);
try {
Person person2 = (Person) person1.clone();
System.out.println("Original Person: " + person1.address.city);
System.out.println("Cloned Person: " + person2.address.city);
// 修改原始对象的地址
person1.address.city = "Los Angeles";
System.out.println("Original Person after modification: " + person1.address.city);
System.out.println("Cloned Person after modification: " + person2.address.city);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
在上面的示例中,在 Person 类和 Address 类中都实现了 clone() 方法,并在 Person 类的 clone()
方法中对 address 字段进行了深拷贝
,从而实现了深拷贝的效果。
上一篇 理解Java的自定义类加载器ClassLoader看这一篇就够了!!! |
记得点赞收藏哦!!!
| 下一篇 Java中的日期时间类详解(建议收藏)!!! |