Javaのクローン可能なインターフェースとobject.clone()に関する混乱

StackOverflow https://stackoverflow.com/questions/1067383

  •  21-08-2019
  •  | 
  •  

質問

私が持っている場合:

class foo implements Cloneable

そして次のようにします:

bar = new foo();
bar.clone();

何も書かなくても浅いコピーが得られます bar.clone() インターフェイスを実装するときに通常行う必要があるコードと同じです。

私の理解では、インターフェイスの関数はそれを実装するクラスによって埋められる必要があり、 Object.clone() 実装はありません (ドキュメントによると、「クラス Object 自体は Cloneable インターフェイスを実装しません」)

では、私の浅いクローンはどこから来たのでしょうか?実装するコードはどこにありますか bar.clone() もし Object.clone() 実装はありませんか?私は混乱しています。

役に立ちましたか?

解決

なれ 非常に慎重 クローンを使用しています。実際、私はそれを完全に避けます。私は持っている 一度もない それが必要だった。しかし...そうは言っても、私がこれまで読んだこのトピックに関する最良の議論は、『Effective Java』の Joshua Bloch によるものです。項目 11 を読んでください:「慎重にクローンをオーバーライドしてください。」

ぜひその項目をお読みください。実際、その章全体 (および本の残りの部分) を読むことをお勧めします。クローンについて知っておくべきことと、それについて私が警告する理由がすべてここにあります。

お役に立てれば。

他のヒント

Object.clone() には次の実装があります。

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()

このリンクでは、Cloneable インターフェイスについて説明しています。http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html

clone() メソッドを呼び出すには、オブジェクトは Cloneable インターフェイスを実装する必要があります。実装されていない場合は、CloneNotSupportedException がスローされます。

定義上、Java のすべてのクラスは基本 Object クラスを拡張し、Object 自体が Cloneable を実装していなくても、Object クラスにはデフォルトの clone() メソッドがあります。自分でオーバーライドしない場合、Object クラスの clone() メソッドが呼び出されます。

私が持っている場合:「クラスフーはクローン可能なものを実装します」

そして次のようにします:バー = 新しい foo();bar.clone();

インターフェイスを実装するときに通常必要とするようなbar.clone()コードを書く必要なく、浅いコピーを取得します。

.clone() メソッドはクラス "foo" 内で呼び出している場合にのみ機能します。 Object 保護されています。

私の理解では、インターフェイスの関数はそれを実装するクラスによって記入する必要があり、object.clone()には実装がありません(ドキュメントによると、「クラスオブジェクトはインターフェイスクローン可能なインターフェイスを実装していません」)

(1) Object.clone() 実装はあります。オブジェクトが実装している場合、オブジェクトの浅いコピーを作成します。 Cloneable. 。(2) .clone() メソッドはインターフェイスの一部ではありません。(3) .clone() メソッドと実装 Cloneable インターフェイスは完全に別のものです。実装する必要があるのは、 Cloneable インターフェイスを使用する場合は、 Objectさんの clone 方法;ただし、これは、 clone クラスのメソッド -- スーパークラスからそのコピーを取得します clone メソッド、最終的には Objectさんの clone 方法。

私の理解では、インターフェイスの関数はそれを実装するクラスによって埋められる必要があり、Object.clone()には実装がありません(ドキュメントによると、「クラスObject自体はイ​​ンターフェイスCloneableを実装しません」)

言うことには違いがあります Object.Clone()には実装がなく、クラスオブジェクトはそれ自体がクローン可能なインターフェイスを実装していません

オブジェクトの clone メソッドには実装があり、clone メソッドを呼び出したオブジェクトのメモリコピーを行います。

おっしゃるとおり、オブジェクト クラスはクローン可能を実装していません。オブジェクトがクローン可能かどうかを確認するだけです。

上記の答えはあなたが本を読むためにあなたがあなたの質問に答えるために簡単な解決策を与えることができると思います

では、私の浅いクローンはどこから来たのでしょうか?オブジェクトのクローンメソッド

Object.clone() が実装されていない場合、bar.clone() を実装するコードはどこにありますか?ネイティブコードで書かれた実装があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top