2009-11-17 8 views
8

vb6またはjavaのオブジェクト複製とは何ですか?どのような状況で私たちはクローンを使用しますか?クローンオブジェクトは何を意味しますか?誰でも私に教えてください。オブジェクトを複製することは何を意味しますか?

+1

経験豊富な人には明らかですが、初心者は「他人のものを変えたときに私のオブジェクトが変わるのはなぜですか」と苦労することがよくあります。名前が基本的にポインタを集めているという認識は、ゆっくりと進みます(そして、クローニングがそのプロセスを大幅に高速化することを理解する)。 –

答えて

11

クローニングは、実際にオブジェクトデータを新しいオブジェクトにコピーしています。

この例では、データのクローンを作成しません:Fooがメンバーaがあり、o.aその後、p.aを変更した場合

Foo p = new Foo(); 
Foo o = p; 

も同じオブジェクトを理由poポイントの両方を変更します。この場合

しかし、

Foo p = new Foo(); 
Foo o = p.Clone(); 

あなたがp.aを変更した場合、彼らは実際にオブジェクトを分離するためにポイントしているため、その後o.aは同じまま。

実際にクローンを作成するには、浅いクローンと深いクローンの2つの方法があります。

シャロークローンは新しいオブジェクトを作成し、メンバーを新しいオブジェクトにコピーします。つまり、メンバーの1つが実際に別のオブジェクトへのポインタである場合、そのオブジェクトは古いオブジェクトと新しいオブジェクトの間で共有されます。

深いクローンが実際に通過し、すべてのメンバーを新しいオブジェクトにクローンします。そうすれば、オブジェクトはすべてのデータの完全なコピーになります。

+0

ところで、セマンティックレベルのクローンである第3のクローニング方法があります。セマンティックレベルのクローン、例えば、リストは、古いものと同じアイテムを含む新しいリストになります。 – supercat

+0

@supercat - それはリストの浅いクローンとどう違うのですか? – Aaron

+0

@Aaron:コレクションが配列への参照として実装され、有効なアイテムの数がカウントされているとします。このようなコレクションを保持するオブジェクトのシャロークローンは、コピーされた有効なアイテム数を持つ新しいオブジェクトですが、元のアイテムと同じアイテムの配列への参照です。準レベルのクローンは、コピーされたカウントと、配列のシャロークローンへの参照を持ちます。 – supercat

2

一般的に話すオブジェクトは参照渡しです。したがって、$objB=$objAと言うと、新しいオブジェクトを取得できません。あなたは同じオブジェクトの新しい名前を取得しています。しかし、$objB= clone $objAと言うと、$objAのコピーが得られます。最初のケースでは、$objBに何をしても、$objAが発生します。 2番目のケースでは、$objBは独立しています。

関連する問題