1

Java の clone() メソッドについて質問があります。まず第一に、クローン方法が壊れていることは知っていますが、学校でこのトピックを勉強しているので、しっかりと把握したいと思います (最も効果的な方法ではないかもしれませんが)。 .

私がこのような状況にあるとしましょう:

public class A implements Cloneable {
    private int a;
    private int b;

    // constructors, methods, etc.

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

public class B extends A {
    private String c;
    private String d;

    // constructors and all the rest

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

さて、私の main() に次のようなものがある場合:

B test1 = new B();
B test2 = (B) test1.clone();

私は、このメソッドがtest1のすべてclone()の値のコピーを作成することを経験から知っています。実際、適切な get/set メソッドのおかげで、 、、およびにアクセスして変更できます。int aint bString cString d

私が本当に得ていないのは、なぜこれがすべてそのように機能するのかということです。clone()つまり、 from Bを実行すると、 from A が呼び出され、次に、 test1 の浅いコピーであるオブジェクトを返すclone()Object が呼び出されます。このようなオブジェクトは、Aに返され、B に返され、Bに返されます。clone()clone()clone()

では、このコピーはどこで行われ、何がコピーされるのでしょうか? A と Bclone()は実際には何もしません (または技術的にはコピーを行いません)。B のメソッドは A のメソッドを呼び出すだけで、A のメソッドはオブジェクトのメソッドを呼び出します。私が昨日見つけたこの質問に対する最初の答えは、A と B の方法の必要性についての私の信念を補強しclone()その特定のケース (たまたま私のものと同じ) では、B の方法clone()はまったく必要ないことを述べています。

これは、オブジェクトclone()すべてのコピーを行うものであることを意味します。ここでのポイントは次のとおりです。オブジェクトは必要なすべてのフィールドをclone()どのように認識しますか?

Object が B のスーパークラスであることが原因ではないかと謙虚に推測しましたが、そのような考えは実際には成り立ちません。実際、A も B のスーパークラスですが、B の中に入れた get/set メソッドがなければ、B のプライベート フィールドにアクセスできません。そして、Objectclone()は私の get/set メソッドに基づいて確実に機能しません。

  • ここで私が見逃しているものはありますか、それとも頭をかなり超えていることを理解しようとしているだけですか?
  • オブジェクトのclone()メソッドは、ある種の「特別な」メソッドか何かですか?
  • オブジェクトがオブジェクトのすべてのフィールドclone()の浅いコピーを作成するということを、これからは公理と見なすことができますか? (それらを非公開にするか、サブクラス/スーパークラスなどでのみ表示するか...)

(できれば参考文献を提供してください。私があなたを信用していないわけではありません。ただ、すべての教科書やオンラインも検索しただけです。次に質問があるときにどこを見ればよいか知りたいです)このような! ;) )

4

1 に答える 1

4

clone() の javadoc は Object.clone() が何をするかを説明します:

クラス Object のメソッド clone は、特定の複製操作を実行します。まず、このオブジェクトのクラスがインターフェース Cloneable を実装していない場合、CloneNotSupportedException がスローされます。すべての配列は、インターフェイス Cloneable を実装すると見なされることに注意してください。それ以外の場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを作成し、割り当てによるかのように、このオブジェクトの対応するフィールドの内容を正確に使用してすべてのフィールドを初期化します。フィールドの内容自体は複製されません。したがって、このメソッドは、「ディープ コピー」操作ではなく、このオブジェクトの「浅いコピー」を実行します。

clone()メソッドはネイティブメソッドです(ソースを見てください)。これは、JVM によってネイティブ コードで実装されます。JVM はもちろん、複製されるオブジェクトのすべての状態にアクセスできます。リフレクションを使用する Java コードでさえ、任意のオブジェクトのすべての状態 (非公開を含む) にアクセスできることに注意してください。

于 2013-06-30T21:43:58.823 に答える