用java描述下浅拷贝和深拷贝
时间: 2023-08-31 14:36:32 浏览: 113
### 回答1:
深拷贝是指创建一个新的对象,其中包含原始对象的所有属性的副本。这意味着,当更改原始对象中的属性时,深拷贝对象中的属性不会受到任何影响。而浅拷贝只是复制了对象的引用,而不是对象本身,所以当更改原始对象中的属性时,浅拷贝对象中的属性也会受到影响。
### 回答2:
浅拷贝和深拷贝是关于对象复制的概念。
浅拷贝是指在拷贝对象时,创建一个新对象,并将原始对象的非静态字段逐个复制到新对象中。但是,如果字段的类型是引用类型,浅拷贝只是复制了引用,而不是复制引用指向的对象。也就是说,原始对象和新对象的引用字段指向的是同一个对象。因此,如果对其中一个对象进行修改,另一个对象也会受到影响。
以下是用Java代码描述浅拷贝的示例:
```java
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Beijing");
Person person1 = new Person("Alice", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
System.out.println(person1.getAddress().getCity()); // Beijing
System.out.println(person2.getAddress().getCity()); // Beijing
// 修改person1的地址
person1.getAddress().setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // Shanghai
System.out.println(person2.getAddress().getCity()); // Shanghai
}
}
```
深拷贝是指在拷贝对象时,不仅创建一个新对象,并将原始对象的字段逐个复制到新对象中,而且对引用类型的字段也进行拷贝,即创建一个新的引用对象。因此,原始对象和新对象的引用类型字段指向的是不同的对象。这样即使对其中一个对象进行修改,另一个对象不会受到影响。
以下是用Java代码描述深拷贝的示例:
```java
public class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
@Override
public Object clone() throws CloneNotSupportedException {
Person clonedPerson = (Person) super.clone();
clonedPerson.address = (Address) address.clone();
return clonedPerson;
}
}
public class Address implements Cloneable {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Beijing");
Person person1 = new Person("Alice", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
System.out.println(person1.getAddress().getCity()); // Beijing
System.out.println(person2.getAddress().getCity()); // Beijing
// 修改person1的地址
person1.getAddress().setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // Shanghai
System.out.println(person2.getAddress().getCity()); // Beijing
}
}
```
通过在`Person`类和`Address`类中实现`Cloneable`接口,并重写`clone()`方法,我们可以实现深拷贝。在`Person`类的`clone()`方法中,我们不仅调用了`super.clone()`以复制非引用类型字段,还将引用类型字段`address`也进行了拷贝,即调用了`address.clone()`方法。这样就实现了深拷贝,执行示例程序后,可以看到对`person1`或`person2`的修改不会相互影响。
阅读全文