当前位置:实例文章 » JAVA Web实例» [文章]Java当中的深拷贝和浅拷贝

Java当中的深拷贝和浅拷贝

发布人:shili8 发布时间:2025-02-12 09:03 阅读次数:0

**浅拷贝和深拷贝**

在 Java 中,对象的复制可以分为浅拷贝和深拷贝两种。理解这两个概念对于编写高质量的 Java代码至关重要。

### 浅拷贝浅拷贝是指创建一个新对象,并将原对象中的所有成员变量(包括基本类型和引用类型)复制到新对象中。但是,这个过程并不对被引用的对象进行复制。也就是说,如果原对象中包含了其他对象的引用,那么浅拷贝后的新对象仍然指向同一个被引用的对象。

**示例代码**

javapublic class Person {
 private String name;
 private int age;

 public Person(String name, int age) {
 this.name = name;
 this.age = 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;
 }
}

public class Main {
 public static void main(String[] args) {
 Person person1 = new Person("John",30);
 Person person2 = (Person) person1.clone(); // 浅拷贝 System.out.println(person1.getName()); // John System.out.println(person1.getAge()); //30 System.out.println(person2.getName()); // John System.out.println(person2.getAge()); //30 person1.setAge(31);
 System.out.println(person1.getAge()); //31 System.out.println(person2.getAge()); //31 }
}

在这个例子中,`person1` 和 `person2` 是两个浅拷贝后的对象,它们都指向同一个 `Person` 对象。因此,当我们修改 `person1` 的年龄时,`person2` 的年龄也会被改变。

### 深拷贝深拷贝是指创建一个新对象,并对原对象中的所有成员变量(包括基本类型和引用类型)进行复制。这意味着如果原对象中包含了其他对象的引用,那么深拷贝后的新对象将拥有自己的副本,而不是指向同一个被引用的对象。

**示例代码**
javapublic class Person {
 private String name;
 private int age;

 public Person(String name, int age) {
 this.name = name;
 this.age = 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;
 }
}

public class Address {
 private String street;
 private String city;

 public Address(String street, String city) {
 this.street = street;
 this.city = city;
 }

 public String getStreet() {
 return street;
 }

 public void setStreet(String street) {
 this.street = street;
 }

 public String getCity() {
 return city;
 }

 public void setCity(String city) {
 this.city = city;
 }
}

public class Main {
 public static void main(String[] args) {
 Person person1 = new Person("John",30);
 Address address1 = new Address("123 Main St", "Anytown");
 person1.setAddress(address1);

 Person person2 = (Person) person1.clone(); // 深拷贝 Address address2 = (Address) address1.clone(); // 深拷贝 System.out.println(person1.getName()); // John System.out.println(person1.getAge()); //30 System.out.println(person1.getAddress().getStreet()); //123 Main St System.out.println(person1.getAddress().getCity()); // Anytown person2.setAddress(new Address("456 Elm St", "Othertown"));
 System.out.println(person1.getAddress().getStreet()); //123 Main St System.out.println(person1.getAddress().getCity()); // Anytown }
}

在这个例子中,`person1` 和 `person2` 是两个深拷贝后的对象,它们都拥有自己的副本。因此,当我们修改 `person2` 的地址时,`person1` 的地址不会被改变。

**总结**

浅拷贝和深拷贝是 Java 中对象复制的两种方式。浅拷贝只对基本类型进行复制,而深拷贝则对所有成员变量(包括基本类型和引用类型)进行复制。如果原对象中包含了其他对象的引用,那么浅拷贝后的新对象仍然指向同一个被引用的对象,而深拷贝后的新对象将拥有自己的副本。

相关标签:算法java开发语言
其他信息

其他资源

Top