ホームページ  >  記事  >  Java  >  オブジェクトのクローン作成は Java でどのように実装されますか?

オブジェクトのクローン作成は Java でどのように実装されますか?

WBOY
WBOYオリジナル
2024-04-11 21:18:01416ブラウズ

Java のオブジェクトのクローンは、Cloneable インターフェイスを通じて実装されます。clone() メソッドをオーバーライドし、明示的に CloneNotSupportedException をスローする必要があります。クローン作成はディープ コピーとシャロー コピーに分類できます: 1. ディープ コピーは、変数フィールドを含むオブジェクトの完全なコピーを作成します; 2. シャロー コピーは参照のみをコピーし、元のオブジェクトとコピーは同じデータを共有します。

オブジェクトのクローン作成は Java でどのように実装されますか?

#オブジェクトのクローン作成は Java でどのように実装されますか?

はじめに

Java プログラミングでは、クローン作成を使用して、元のオブジェクトを変更せずにオブジェクトのコピーを作成します。オブジェクトのクローン作成は、オブジェクトの複数のインスタンスの作成、元のオブジェクトの変更を避けるためにオブジェクトのコピーを渡す、深いコピーと浅いコピーの実装など、さまざまなシナリオで使用できます。

クローンの実装

Java のクローンは、Cloneable インターフェイスによって実装されます。クローン作成を実装したいクラスは、このインターフェイスを実装し、clone() メソッドをオーバーライドする必要があります。 clone() メソッドはオブジェクトのクローンを返します。クラスがクローン作成をサポートしていない場合は、明示的に CloneNotSupportedException をスローする必要があります。

ディープ コピーとシャロー コピー

オブジェクトのクローンを作成する場合、ディープ コピーとシャロー コピーの 2 種類のコピーを作成できます。

  • ディープ コピー: すべてのフィールドを含むオブジェクトの完全に新しいコピーを作成します。変更可能なフィールドもコピーされるため、コピーに変更を加えても元のオブジェクトには影響しません。
  • 浅いコピー: オブジェクトとその可変フィールドへの参照のみがコピーされます。元のオブジェクトとコピーは、同じ基になるデータを指します。したがって、コピーに対する変更は元のオブジェクトにも影響します。

実際的なケース

次の Student クラスについて考えてみましょう。このクラスには、名前、年齢、住所の 3 つのフィールドがあります:

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 クラスは複製可能であるため、これはディープ コピーです。クローン オブジェクトのアドレス フィールドを変更しても、元のオブジェクトのアドレス フィールドには影響しません。

以上がオブジェクトのクローン作成は Java でどのように実装されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。