Maison  >  Article  >  Java  >  Comment le clonage d’objets est-il implémenté en Java ?

Comment le clonage d’objets est-il implémenté en Java ?

WBOY
WBOYoriginal
2024-04-11 21:18:01417parcourir

Le clonage d'objets en Java est implémenté via l'interface Cloneable, et la méthode clone() doit être remplacée et CloneNotSupportedException doit être explicitement levée. Le clonage peut être divisé en copie profonde et copie superficielle : 1. La copie profonde crée une copie complète de l'objet, y compris les champs variables. 2. La copie superficielle copie uniquement la référence, et l'objet d'origine et la copie partagent les mêmes données ;

Comment le clonage d’objets est-il implémenté en Java ?

Comment le clonage d'objets est-il implémenté en Java ?

Introduction

En programmation Java, le clonage est utilisé pour créer une copie d'un objet sans modifier l'objet d'origine. Le clonage d'objets peut être utilisé dans divers scénarios, tels que la création de plusieurs instances d'un objet, la transmission d'une copie d'un objet pour éviter de modifier l'objet d'origine et la mise en œuvre de copies profondes et superficielles.

Implémentation du clonage

Le clonage en Java est implémenté par l'interface Cloneable. Toute classe souhaitant implémenter le clonage doit implémenter cette interface et remplacer la méthode clone(). La méthode clone() renvoie un clone de l'objet et doit explicitement lever CloneNotSupportedException si la classe ne prend pas en charge le clonage. Cloneable 接口实现的。任何希望实现克隆的类都必须实现此接口并覆盖clone() 方法。clone() 方法返回对象的克隆,并且必须显式抛出 CloneNotSupportedException,如果该类不支持克隆。

深层拷贝和浅层拷贝

当克隆对象时,可以进行两种类型的拷贝:深层拷贝和浅层拷贝。

  • 深层拷贝: 创建对象副本的完全新副本,包括其所有字段。即使是可变字段也会被复制,因此对副本的任何更改都不会影响原始对象。
  • 浅层拷贝: 仅复制对象及其可变字段的引用,原始对象和副本指向相同的底层数据。因此,对副本的任何更改也会影响原始对象。

实战案例

考虑以下 Student 类,它具有三个字段:姓名、年龄和地址:

public class Student implements Cloneable {
  private String name;
  private int age;
  private Address address;

  @Override
  public Object clone() throws CloneNotSupportedException {
    return super.clone();
  }

  // 省略getter 和 setter 方法
}

Address 类也是可克隆的:

public class Address implements Cloneable {
  private String street;
  private String city;
  private String state;

  @Override
  public Object clone() throws CloneNotSupportedException {
    return super.clone();
  }

  // 省略getter 和 setter 方法
}

现在,考虑以下代码:

// 创建原始 Student 对象
Student originalStudent = new Student();
originalStudent.setName("John Doe");
originalStudent.setAge(21);
Address originalAddress = new Address();
originalAddress.setStreet("123 Main Street");
originalStudent.setAddress(originalAddress);

// 克隆原始Student对象
Student clonedStudent = (Student) originalStudent.clone();

// 修改克隆对象的字段
clonedStudent.setName("Jane Doe");
clonedStudent.setAge(22);
Address clonedAddress = clonedStudent.getAddress();
clonedAddress.setStreet("456 Elm Street");

// 输出原始和克隆对象
System.out.println("Original Student:" + originalStudent);
System.out.println("Cloned Student:" + clonedStudent);

输出将显示:

Original Student:Student{name='John Doe', age=21, address=Address{street='123 Main Street', city=null, state=null}}
Cloned Student:Student{name='Jane Doe', age=22, address=Address{street='456 Elm Street', city=null, state=null}}

在这种情况下,由于 Address

🎜Copie profonde et copie superficielle🎜🎜🎜Lors du clonage d'un objet, deux types de copies peuvent être effectuées : la copie profonde et la copie superficielle. 🎜
  • 🎜Copie approfondie : 🎜 Créez une toute nouvelle copie d'un objet, y compris tous ses champs. Même les champs mutables sont copiés, donc toute modification apportée à la copie n'affectera pas l'objet d'origine.
  • 🎜Copie superficielle : 🎜 Seules les références à l'objet et à ses champs mutables sont copiées. L'objet d'origine et la copie pointent vers les mêmes données sous-jacentes. Par conséquent, toute modification apportée à la copie affecte également l'objet d'origine.
🎜🎜Cas pratique🎜🎜🎜Considérons la classe Étudiant suivante, qui comporte trois champs : nom, âge et adresse : 🎜rrreee🎜Adresse La classe est également clonable : 🎜rrreee🎜 Maintenant, considérons le code suivant : 🎜rrreee🎜La sortie affichera : 🎜rrreee🎜Dans ce cas, puisque la classe Address est clonable, il s'agit d'une copie profonde . Lorsque vous modifiez le champ d'adresse d'un objet cloné, cela n'affecte pas le champ d'adresse de l'objet d'origine. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn