Javaのクローン可能なインターフェースとobject.clone()に関する混乱
質問
私が持っている場合:
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() を実装するコードはどこにありますか?ネイティブコードで書かれた実装があります。