深入理解Java对象复制
在Java中拥有复制一个对象的需求并不少见,可是Java中的对象复制并不是一件轻松的事情。如果我们不明白Java中对象复制的本质,很容易在实现对象复制时犯错。本文将通过深入理解Java对象复制进行详细讲解。
Java中的对象复制的两种方式
在Java中实现对象复制,可以分为浅复制和深复制两种方式。浅复制只是复制了对象的引用,不会新建一个对象;而深复制则是新建一个对象,完整地复制所有属性和数据。
浅复制
浅复制中,只是复制了对象的引用,因此对新对象所进行的操作会影响到原对象。
我们可以通过以下的示例代码进行说明:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
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;
}
}
在以上代码中,实现了Cloneable
接口,并重写了clone
方法,在clone
方法中调用了Object
类的clone
方法。
现在,我们来创建一个Person
对象,并进行浅复制:
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Tom", 25);
Person person2 = person1.clone();
person2.setName("Jerry");
System.out.println(person1.getName()); //输出 "Jerry"
}
结果显示person1的名字也改变了,说明person1和person2共享了同一个Person对象。将人员作为一个类,只进行简单的浅复制显然是不够的。
深复制
深复制会新建一个对象,完整地复制所有属性和数据。这种方式不会影响到原对象。
以下是深复制示例代码:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public Person clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setName(new String(this.name));
return person;
}
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;
}
}
在以上代码中,也实现了Cloneable
接口,并重写了clone
方法,与浅复制不同的是,在深复制中,我们需要将name
属性也进行复制,这样就能够得到一个完整的新对象。
现在,我们来创建一个Person
对象,并进行深复制:
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Tom", 25);
Person person2 = person1.clone();
person2.setName("Jerry");
System.out.println(person1.getName()); //输出 "Tom"
}
结果显示person1的名字没有改变,说明person2是重新建立了一个Person对象,与原对象相互独立。
小结
通过上述两个示例,我们可以看到Java中的对象复制不是一件简单的事情,需要根据实际情况来进行选择。浅复制只是复制了对象的引用,不会新建一个对象,深复制则是新建一个对象并完整地复制所有属性和数据。同时需要注意的是,如果对象中有其他类型的引用,那么也需要对这些引用进行复制,以保证新对象的完整性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Java对象复制 - Python技术站