3

このクローン作成メカニズムを使用するのは良い考えではないことはわかっています (何人かの著者が示唆しているように「壊れている」ため)。次のクラス階層が与えられます。

class N implements Cloneable{
    protected int num;
    public N clone() throws CloneNotSupportedException{
        return (N)super.clone();
    }
}

class M extends N{
    protected String str;
    public M clone() throws CloneNotSupportedException{
        M obj = (M)super.clone();
        obj.setString(new String(this.str));
        return obj;
    }
    void setString(String str){
        this.str = str;
    }
}

Nextends以来Object、 はどのようにしてsuper.clone()のインスタンスを返しますNか? super.clone()は、実際Object.clone()には class のオブジェクトへの参照を返しますObject。にキャストできるのはなぜNですか?クラスにないNメンバがあります。デフォルトの動作では、実際にこの変数を自動的に複製するにはどうすればよいでしょうか ( class に記録がないため)。numObjectObject

また、同じことが M にも当てはまります。 では、オブジェクトを class (によって返される)M.clone()から class のオブジェクトにキャストしています。これがすべて有効であることはわかっていますが、その理由はわかりません。Nsuper.clone()M

4

4 に答える 4

6

Object#cloneオブジェクトの低レベルのバイナリ コピーを作成するネイティブ メソッドであり、同じクラスの別のインスタンスを生成します。したがって、ダウンキャストしても安全です。

これは、ポリモーフィック クローニング メソッドを持つ唯一の方法であることに注意してください。

于 2013-05-22T09:43:03.457 に答える
2

技術的にObject.clone()は、ネイティブ メソッドです。

protected native Object clone() throws CloneNotSupportedException;

また、JVM は現在のオブジェクトの大きさとオブジェクトの型を内部的に認識しています。したがって、適切なオブジェクトをビットごとのコピーとして作成し、それへの参照を返すことができます。

于 2013-05-22T09:43:45.550 に答える
0
  1. N はオブジェクトを拡張するので、super.clone() はどのようにして N のインスタンスを返すのでしょうか?
  2. super.clone() は実際には、クラス Object のオブジェクトへの参照を返す Object.clone() です。なぜそれを N にキャストできるのでしょうか?
  3. N には、クラス Object にないメンバー num があります。
    デフォルトの動作では、実際にこの変数を自動的に複製するにはどうすればよいでしょうか (Object クラスに記録がないため)。

答え:

  1. 実行時には、親クローン メソッドを呼び出す N クラスのインスタンス内にいます。N クラスでオーバーライドした場合とまったく同じと考えてください。Object クラスは、ネイティブの抽象オブジェクトです。実際に N.toString() を呼び出すときは、JVM が N の階層で見つけた最初の toString メソッドを呼び出します。
  2. ここでも同じですが、あなたは N クラスのインスタンスにいることを思い出してください。
  3. そうではありません: Javaでオブジェクトをコピーするにはどうすればよいですか?
于 2013-05-22T09:54:29.527 に答える
0

次のように、 XStreamオブジェクトを使用してオブジェクトを複製することもできます。

public static <T> T cloneObject(
    T object) {
    XStream xstream = new XStream();
    return (T) xstream.fromXML(xstream.toXML(object));
  }
于 2013-05-22T10:11:06.513 に答える