亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

Java的深拷貝與淺拷貝怎么使用

小億
88
2023-08-17 23:39:11
欄目: 編程語言

在Java中,對象的拷貝分為淺拷貝和深拷貝兩種方式。

淺拷貝是指創建一個新的對象,然后將原對象的非靜態字段值復制到新對象中。新對象和原對象的引用類型字段將指向相同的對象。可以通過實現Cloneable接口并重寫clone()方法來實現淺拷貝。

深拷貝是指創建一個新的對象,然后將原對象的非靜態字段值復制到新對象中。新對象和原對象的引用類型字段也將被復制,即引用類型字段指向的對象也會被復制。可以通過實現Serializable接口,將對象序列化為字節流,然后再反序列化為新對象來實現深拷貝。

下面是兩種拷貝方式的示例代碼:

  1. 淺拷貝示例:
class Person implements Cloneable {
private String name;
private int age;
private Address address;
// 省略構造方法和getter/setter
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
private String city;
private String street;
// 省略構造方法和getter/setter
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("Beijing", "Dongcheng");
Person person1 = new Person("Alice", 25, address);
Person person2 = (Person) person1.clone();
System.out.println(person1 == person2); // false
System.out.println(person1.getAddress() == person2.getAddress()); // true
}
}
  1. 深拷貝示例:
import java.io.*;
class Person implements Serializable {
private String name;
private int age;
private Address address;
// 省略構造方法和getter/setter
public Person deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Person) ois.readObject();
}
}
class Address implements Serializable {
private String city;
private String street;
// 省略構造方法和getter/setter
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Address address = new Address("Beijing", "Dongcheng");
Person person1 = new Person("Alice", 25, address);
Person person2 = person1.deepCopy();
System.out.println(person1 == person2); // false
System.out.println(person1.getAddress() == person2.getAddress()); // false
}
}

需要注意的是,深拷貝要求被拷貝的對象及其引用類型字段都必須實現Serializable接口。如果對象的某個引用類型字段沒有實現Serializable接口,那么拷貝將會失敗。

0
安义县| 饶阳县| 青海省| 广德县| 青阳县| 读书| 得荣县| 色达县| 乐陵市| 舟山市| 肃南| 阿尔山市| 儋州市| 芮城县| 永城市| 睢宁县| 墨竹工卡县| 扎赉特旗| 揭东县| 湖南省| 泾川县| 克什克腾旗| 德保县| 玛曲县| 马公市| 盘锦市| 延吉市| 武胜县| 浦县| 恩施市| 云安县| 永丰县| 镇沅| 达州市| 长岛县| 时尚| 遵义市| 山东省| 临漳县| 衡东县| 行唐县|