私はから読んclone
でEffective Java
いますそれはclone
呼び出される最初のメソッドではでなければならないと言っていますsuper.clone()
この場合、私は最終的には階層チェーンを上るということを呼び出すことになると思いclone
ますjava.lang.Object
。
しかし、オブジェクトのクローンは何もしないと思いました。
コードを見る
protected native Object clone() throws CloneNotSupportedException;
と、実装はありません。しかし、この段落から、クラスにプリミティブフィールドしかない場合は、クローンを作成するには
呼び出しで十分であるように思われます。
しかし、どのように?です。
(ClassX) super.clone()
super.clone
Object
3 に答える
Object でのこの宣言
protected native Object clone() throws CloneNotSupportedException;
...clone
メソッドがネイティブ コードで実装されていることを意味します。つまり、カーテンの後ろで魔法が起こっています。
Object.clone()
が実際に何かを行うことを保証できます...クラスが実装として宣言されている場合Cloneable
。しかし、それが行うことはプレーンな Java では表現できません。
clone() は、オブジェクトを複製するための Java のメソッドです。Java では、オブジェクトは参照変数を介して操作され、オブジェクトをコピーするための演算子はありません。代入演算子は、オブジェクトではなく参照を複製します。clone() メソッドは、この不足している機能を提供します。
そうです、常に呼び出す必要があるオブジェクトを複製するときはsuper.clone()
(最初のステートメントとして)、オブジェクトの残りの部分を手動で複製します。これは、オブジェクトを複製するときに、そのスーパー クラス部分がオブジェクトも正しい方法でクローンを取得します...
オブジェクトが clone をサポートしていない場合は、それがスローしCloneNotSupportedException
ます。これは、スーパー オブジェクトを複製しようとして例外が発生した場合、サブタイプにも複製オブジェクトを実装できず、オブジェクトを複製できないことを意味します。オブジェクトのクローン作成操作を禁止する状況はいくつかあります。