2017-02-08 10 views
-2

私は初心者です。私のオブジェクトのコピーを作成する

のは、私はクラスfooを持っており、オブジェクトfoo firstを作成したと言うと、それにいくつかのデータを入れてみましょう:

foo first = new foo(); 
first.data="mydata"; 

私はその後、別のオブジェクトfoo secondを作成し、それは同じ内容(ただし、同一のメモリを持つようにしたいです場所)はfirstです。それを達成するために私は次のことをすることはできますか?

foo second = new foo(); 
second = first; 

それとも、これはちょうど同じメモリアドレスにfirstsecondを設定し、私は効果的にメモリ内の単一のオブジェクト上に2つのハンドルを取得していますか?

私はオブジェクトのクローンについて読んで、それはあまりにも複雑に思えます。 foo second = new foo();に新しいfooを定義する手間を掛けてから、コンパイラはsecond = first;が最初のものだけを指し示すのではなく、全体をコピーしようとしていることを認識すべきです。それはどういう仕組みですか?

私の質問です:なぜこれはどのように動作しないのですか?上記のようなコンパイラの設定の欠点は何ですか?

+2

「オブジェクトのクローンについて読むと複雑すぎるようです」 - うーん、あなたはそれについてもっと知る必要があるでしょう。私は 'clone()'で[copy ctor](http://www.javapractices.com/topic/TopicAction.do?Id=12)をお勧めします。また、[accessors/mutators](http://stackoverflow.com/a/15711958/2071828)を直接変数アクセスよりも使用することをお勧めします。 –

+0

* "それはどのように機能するのですか?" *そうであれば、他のユーザーがオブジェクトを複製するのに "複雑な"ものを書いているのはなぜだと思いますか? – Tom

+0

@Tom goot point!私は私の質問がむしろ「なぜこれがどのように機能するのか」ということにはならないと思いますか? – Kagaratsch

答えて

3

コピーコンストラクタを使用することをお勧めします。

clone()については、非常に議論の余地があり、落胆していることにご注意ください(理由を知りたい場合はGoogle)。注目すべき例外は配列です!

コピーコンストラクタは次のように動作します。別のFooを取るのFooのコンストラクタで

Foo first = new Foo(); 
first.data="mydata"; 

Foo second = new Foo(first); 

、ちょうど彼らが複雑なオブジェクトである場合には、あまりにも自分のコピーcontructorsを使用して、フィールドをコピーします。

+0

これは天才です!ありがとうございました。 – Kagaratsch

関連する問題