0

java.lang.Cloneableインターフェースごとに:

言うためのドキュメントCloneable-

このインターフェイスには clone メソッドが含まれていないことに注意してください。したがって、このインターフェースを実装しているという事実だけでは、オブジェクトを複製することはできません。clone メソッドが反射的に呼び出されたとしても、それが成功するという保証はありません。

しかし、次のコードは正しく機能しています。を呼び出してもエラーは発生しませんex1.clone

package com.sriPushpa.thread;

public class exceptionHandling implements Cloneable {
    int a = 10;

    public static void main(String args[]) {
        exceptionHandling ex1 = new exceptionHandling();
        exceptionHandling ex2 = null;
        try {
            ex2 = (exceptionHandling) ex1.clone();

        } catch (CloneNotSupportedException e) {

            e.printStackTrace();
        }
        System.out.println("SUCCESS");
    }

}
4

3 に答える 3

4

あなたの場合、Objectすべてのクラスがクラスから継承されるため、メソッドが呼び出されますjava.lang.Object。このclone()実装は、フィールドごとのコピーのみを行います。

Cloneableマーカー インターフェイスです。マーカー インターフェイスは、メソッドも変数も定義されていないインターフェイスですが、実行時にオブジェクトに関する型情報を提供するために使用されます。

このマーカー インターフェースをクラス定義に追加することで、クラスのCloneNotSupportedException呼び出しによって no がスローされないことが保証さcloneれます。


一般的なアドバイスは、コピー コンストラクターとクローン作成 (Josh Bloch) を調べて、本当に使用するかどうかを検討することですclone

于 2012-07-15T19:24:55.053 に答える
3

ルート クラスjava.lang.Objectにはメソッドclone()が含まれます。デフォルトでは、具象クラスが Cloneable を実装する場合、デフォルト クラスの実装はシャロー コピーを作成します。

メソッドのドキュメントから:

クラス Object のメソッド clone は、特定の複製操作を実行します。まず、このオブジェクトのクラスがインターフェース Cloneable を実装していない場合、CloneNotSupportedException がスローされます。... したがって、このメソッドは、「ディープ コピー」操作ではなく、このオブジェクトの「浅いコピー」を実行します。

于 2012-07-15T19:23:19.977 に答える
1

このメソッドは、保護されたメソッドとしてclone()によって実装されます。複製したクラスと同じクラスからメソッドをjava.lang.Object呼び出しているため、コードは機能します。clone()

オブジェクトを複製可能にしたい場合は、clone()メソッドをオーバーライドして公開する必要があります。

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

clone()ドキュメントには、 Cloneable インターフェースを実装すると常に失敗するとは書かれていないことに注意してください。それを実装することは、機能することを保証するものではないと述べていclone()ます。これは非常に異なります。

于 2012-07-15T19:28:55.097 に答える