java 浅克隆与深克隆的区别
时间: 2024-06-13 15:06:00 浏览: 11
Java中的克隆分为浅克隆和深克隆两种方式。浅克隆只是复制了对象的引用,而不是对象本身,因此对克隆对象的修改会影响到原对象。而深克隆则是将对象及其引用对象一起复制,因此对克隆对象的修改不会影响到原对象。
以下是Java中实现浅克隆和深克隆的示例代码:
1. 浅克隆
```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;
}
}
// 测试代码
Address address = new Address("Beijing");
Person person1 = new Person("Tom", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
address.setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // 输出:Shanghai
System.out.println(person2.getAddress().getCity()); // 输出:Shanghai
```
2. 深克隆
```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 person = (Person) super.clone();
person.address = (Address) address.clone();
return person;
}
}
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();
}
}
// 测试代码
Address address = new Address("Beijing");
Person person1 = new Person("Tom", address);
Person person2 = (Person) person1.clone();
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
address.setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // 输出:Beijing
System.out.println(person2.getAddress().getCity()); // 输出:Beijing
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)