java 深刻隆和浅克隆的面试点
时间: 2024-02-22 21:52:26 浏览: 16
浅克隆和深克隆是Java中的两个重要面试点,它们涉及到对象的克隆和引用类型的处理。
1. 浅克隆(Shallow Clone):
浅克隆是指在克隆对象时,只复制对象本身和其基本数据类型的成员变量,而不复制引用类型的成员变量。因此,克隆出的对象和原对象共享引用类型的成员变量,即两个对象的引用指向同一块内存地址,即同一个对象。
2. 深克隆(Deep Clone):
深克隆是指在克隆对象时,不仅复制对象本身和其基本数据类型的成员变量,还复制引用类型的成员变量。这样,克隆出的对象和原对象的引用类型成员变量指向不同的内存地址,即两个对象是完全独立的。
在Java中,实现浅克隆可以通过实现Cloneable接口并重写clone()方法来实现。而实现深克隆则需要通过序列化和反序列化来实现,即将对象写入字节流,再从字节流中读取出来,这样就可以得到一个全新的对象。
以下是一个示例代码,演示了Java中的浅克隆和深克隆:
```java
// 浅克隆示例
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
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
}
public class CloneExample {
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.getAddress() == person2.getAddress()); // 输出:true,引用类型成员变量共享同一块内存地址
// 修改person2的地址
person2.getAddress().setCity("Shanghai");
System.out.println(person1.getAddress().getCity()); // 输出:Shanghai,person1的地址也被修改了
// 深克隆
Person person3 = new Person(person1.getName(), new Address(person1.getAddress().getCity()));
System.out.println(person1.getAddress() == person3.getAddress()); // 输出:false,引用类型成员变量指向不同的内存地址
// 修改person3的地址
person3.getAddress().setCity("Guangzhou");
System.out.println(person1.getAddress().getCity()); // 输出:Shanghai,person1的地址不受影响
}
}
```