技術共有

Javaのディープコピーとシャローコピーの違いを教えてください。 Java の匿名内部クラスとは何ですか?その応用シナリオは何ですか?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Javaのディープコピーとシャローコピーの違いを教えてください。

Java では、ディープ コピーとシャロー コピーはオブジェクトをコピーする 2 つの方法であり、オブジェクトをコピーするときの動作は本質的に異なります。

浅いコピー

浅いコピーとは、新しいオブジェクトを作成し、フィールドが値型の場合はそのフィールドを少しずつコピーすることを指します。参照はコピーされますが、コピーされません。 参照されたオブジェクトはコピーされません。したがって、元のオブジェクトとそのコピーは同じオブジェクトを参照します。

Java では、これは次のようにして実現できます。Cloneableインターフェイスとリライトclone()浅いコピーを実装する方法。Objectクラスでclone()この方法では浅いコピーを実現できます。

class Original implements Cloneable {
private int[] nums;
public Original() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

この例では、nums参照型です。もしOriginalオブジェクトは浅くコピーされ、その後、numsそして元のオブジェクトではnums同じ配列オブジェクトを指します。

ディープコピー

ディープ コピーは、オブジェクト自体をコピーするだけでなく、オブジェクトに含まれるすべての参照型のメンバー変数も再帰的にコピーします。つまり、コピーと元のオブジェクトは参照型のメンバー変数を共有しません。 1 つのオブジェクトのメンバー変数を変更しても、別のオブジェクトには影響しません。

Java では、ディープ コピーを実装するには、参照型のすべてのメンバー変数が適切にコピーされるようにコードを手動で記述する必要がよくあります。

class DeepCopied implements Cloneable {
private int[] nums;
public DeepCopied() {
nums = new int[5];
}
public void setNums(int[] nums) {
this.nums = nums;
}
@Override
public Object clone() throws CloneNotSupportedException {
DeepCopied copied = (DeepCopied) super.clone();
copied.nums = nums.clone(); // 对引用类型的成员变量也进行拷贝
return copied;
}
}

この例では、nums配列もコピーされるため、元のオブジェクトとコピーは共有されませんnums配列。

要約する

  • 浅いコピーオブジェクト自体とその非静的フィールドはコピーされますが、参照されるオブジェクトはコピーされません。
  • ディープコピーオブジェクト自体とその非静的フィールドがコピーされるだけでなく、参照型のすべてのメンバー変数も再帰的にコピーされます。

ディープ コピーとシャロー コピーのどちらを使用するかは、特定のアプリケーションのシナリオと要件によって異なります。


Java の匿名内部クラスとは何ですか?その応用シナリオは何ですか?