1

オブジェクトを複製する簡単なプログラムがあります。「スレッド "main" java.lang.CloneNotSupportedException: で例外が発生しました:」というエラーをグーグル検索しましたが、エラーを理解するためにあなたの助けが必要です。obj1 の複製を取得できないのはなぜですか?

public class Test{
int a;
int b;
public Test(int a , int b){
    this.a=a;
    this.b=b;
    }
public static void main(String[]args) throws CloneNotSupportedException{
    Test obj1=new Test(2, 4);
    Test obj2=(Test) obj1.clone();
       }
 }
4

2 に答える 2

4

この問題は、クラスがインターフェイスTestを実装していないために発生しCloneableます。API仕様に記載されているように、

クラス [..] がインターフェイス Cloneable を実装していない場合、CloneNotSupportedException がスローされます。

修正するには、次のようにしてください。

public class Test implements Cloneable { 
  ...
}

このインターフェースはメソッドを宣言していないため ( のようにマーカーインターフェースCloneableと呼ばれます)、これ以上何もする必要はありません。クラスのインスタンスを複製できるようになりました。SerializableTest

ただし、デフォルトの複製メカニズム (つまり、 の複製メカニズムObject) は、まさに探しているものではない可能性があり、clone()メソッドをオーバーライドしたい場合があります。デフォルトでは、浅いコピーを作成します。つまり、クラスの新しい個別のインスタンスを取得しますが、両方のインスタンスのフィールドは同じオブジェクトを参照します! 例えば:

class C1 {
  Object o;
}
class C2 implements Cloneable {
  C1 c1;
}

... main ... {
  C2 c2 = new C2();
  c2.c1 = new C1();
  c2.c1.o = new Object();
  C2 c2clone = c2.clone();
  System.out.println(c2 == c2clone); // prints false
  System.out.println(c2.c1 == c2clone.c1); // prints true
  c2.c1.o = new Object(); // modified both c2 and c2clone!!!

最後の行は、c2 と c2clone の両方を変更します。これは、両方が c1 の同じインスタンスを指しているためです。最後の行で c2 のみを変更する場合は、ディープ コピーと呼ばれるものを作成する必要があります。

于 2011-07-07T05:33:07.603 に答える
2

You have to implement Cloneable. It's a marker interface.

Your program should be

    public class Test implements Cloneable{
         //rest of the program
    }
于 2011-07-07T05:34:45.987 に答える