合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
在Java中,对象的拷贝可以分为浅拷贝(shallow copy)和深拷贝(deep copy)。
创建一个新对象,然后将原始对象中的非静态字段复制到新对象。如果字段是值类型,那么对该字段执行逐位复制。如果字段是引用类型,则递归地复制该字段引用的对象,而不是只复制引用。
在Java中,深拷贝通常需要我们自己写代码来实现,因为Java并没有提供直接实现深拷贝的内置方法。
深拷贝的一个常见实现方式是使用序列化。我们可以将对象写入到一个流中,然后再从流中读取出来,这样得到的就是原对象的一个深拷贝。但是这种方法有一些限制,比如被拷贝的对象以及它引用的所有对象都必须是可序列化的。
注意:Cloneable接口和clone()方法的设计在Java社区中常常被认为是有缺陷的,因为它们有很多问题,比如Cloneable接口没有定义任何方法(它是一个标记接口),clone()方法的访问修饰符是protected,而且它使用的是浅拷贝,这可能会导致意外的对象共享问题。因此,在实际编程中,很多开发者更倾向于自己写代码来实现对象的拷贝,而不是使用Cloneable接口和clone()方法。
我们定一个实体类People,实现了Cloneable接口,并且重写了clone()方法当然也是直接调用的父类的clone()方法。
public class People implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected People clone() throws CloneNotSupportedException {
return (People) super.clone();
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
TOP