2

どのような場合にこの方法を使用する必要がありますか:

public A clone() throws CloneNotSupportedException {
    A clone = (A)super.clone();
    clone.x= this.x;
    return clone;
}

そして、どの場合にそのように使用する必要がありますか:

public ShiftedStack clone() throws CloneNotSupportedException {
    return new A(this.x);
}

xが final で、最初の方法を使用したい場合はどうすればよいですか?

最初の方法については、次のように理解しています。スーパークラスを複製してアップキャストしたため、一部のメンバーが初期化されていません。この後、これらのメンバーを初期化します。私の理解は正しいですか?

ありがとうございました。

4

2 に答える 2

4

2つのこと:

1) 最初の形式では、データ メンバ (clone.x=this.x) をシャロー コピーする必要はありません。Object.clone() がそれを行います。

2) 2 番目の形式を使用する場合は注意してください。これは常に具象型 A のインスタンスを作成するため、A を B で拡張すると、B.clone() はそのスーパークラスの clone メソッドを使用できなくなります。

- 編集 -

あなたの質問に関して、メソッド clone() がクラス X の階層の上に適切に実装されている場合、クラス X の実装で super. clone() を呼び出すと、タイプXのインスタンスが返されます。Object から継承されたデフォルトの clone() は、呼び出し元の具象クラスのインスタンスを作成するという意味で、「魔法のメソッド」です。また、すべてのデータ メンバーの浅いコピーも実行します。通常、 clone() の実装では、ソースとクローンの間で変更可能なオブジェクトの共有参照を避けるために、ディープ コピーを実行します。

于 2010-04-25T22:54:44.767 に答える
-2

最初の方法は機能しません。親クラスのクローンをアップキャストすることはできません。親クラスのインスタンスになります。

A clone = (A)super.clone();   // can't do this
于 2010-04-25T23:03:12.863 に答える