Java对象深复制与浅复制实例详解
在 Java 中,对象的复制分为浅复制和深复制两种方式。本文将详细讲解 Java 中对象复制的概念、浅复制和深复制的实现方式、以及深浅复制的应用场景。
对象复制的概念
在 Java 中,我们可以通过 new 运算符来生成新的对象实例,但是有时候我们需要创建一个新对象,它的属性和原对象一模一样而且它们内存地址不同,这个时候就需要使用对象复制。
对象复制分为两种方式,浅复制和深复制。
浅复制
浅复制是指创建一个新对象,其属性和原对象的属性全部相同,但是引用类型对象的内存地址仍然相同。也就是说,新对象与原对象的引用对象之间共享内存地址,对其中一个对象的引用对象进行修改会影响到另一个对象的引用对象。
以下是一个浅复制的示例代码:
class Person implements Cloneable {
String name;
Phone phone;
public Person(String name, Phone phone) {
this.name = name;
this.phone = phone;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public String toString() {
return "Person{name='" + name + "', phone=" + phone.toString() + "}";
}
}
class Phone {
String model;
String color;
public Phone(String model, String color) {
this.model = model;
this.color = color;
}
public String toString() {
return "Phone{model='" + model + "', color='" + color + "'}";
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Phone phone = new Phone("iPhone", "white");
Person person1 = new Person("张三", phone);
Person person2 = (Person) person1.clone();
System.out.println("person1: " + person1.toString());
System.out.println("person2: " + person2.toString());
// 修改 phone 对象
phone.model = "Samsung";
phone.color = "black";
System.out.println("person1 after modification: " + person1.toString());
System.out.println("person2 after modification: " + person2.toString());
}
}
输出结果:
person1: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person2: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person1 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}
person2 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}
从上述代码执行的结果可以看出,person1 和 person2 的 phone 引用对象是相同的,当修改 phone 对象时,不论是 person1 还是 person2 都会受到影响。
深复制
深复制是指创建一个新对象,其属性和原对象的属性全部相同,包括引用类型对象的内存地址都是不同的。也就是说,新对象中的所有属性都是全新的,与原对象的属性之间不会共享内存地址,对其中一个对象的引用对象进行修改不会影响到另一个对象的引用对象。
以下是一个深复制的示例代码:
class Person implements Cloneable {
String name;
Phone phone;
public Person(String name, Phone phone) {
this.name = name;
this.phone = phone;
}
public Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.phone = (Phone) phone.clone();
return person;
}
public String toString() {
return "Person{name='" + name + "', phone=" + phone.toString() + "}";
}
}
class Phone implements Cloneable {
String model;
String color;
public Phone(String model, String color) {
this.model = model;
this.color = color;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public String toString() {
return "Phone{model='" + model + "', color='" + color + "'}";
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Phone phone = new Phone("iPhone", "white");
Person person1 = new Person("张三", phone);
Person person2 = (Person) person1.clone();
System.out.println("person1: " + person1.toString());
System.out.println("person2: " + person2.toString());
// 修改 phone 对象
phone.model = "Samsung";
phone.color = "black";
System.out.println("person1 after modification: " + person1.toString());
System.out.println("person2 after modification: " + person2.toString());
}
}
输出结果:
person1: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person2: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
person1 after modification: Person{name='张三', phone=Phone{model='Samsung', color='black'}}
person2 after modification: Person{name='张三', phone=Phone{model='iPhone', color='white'}}
从上述代码执行的结果可以看出,person1 和 person2 的 phone 引用对象是不同的,当修改 phone 对象时,只有 person1 被影响,而 person2 没有变化。
深浅复制的应用场景
浅复制和深复制的使用场景是不同的。在实际开发中,应该根据场景选择合适的复制方式。
浅复制适用于以下场景:
- 对象的属性比较简单。
- 其中一个对象没必要拥有自己的引用对象副本。
深复制适用于以下场景:
- 对象的属性比较复杂,其中包含了大量的引用类型对象。
- 这些引用类型对象必须独立存在,不能共享内存地址。
- 对象被修改后不希望对另一个对象产生影响。
结论
本文主要讲解了 Java 中对象复制的概念、浅复制和深复制的实现方式,以及深浅复制的应用场景。
在实际开发中,应该根据实际需求选择合适的复制方式,避免因为复制的问题而导致程序出错。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象深复制与浅复制实例详解 - Python技术站