2017-02-08 42 views
-2

我是初學者,我對以下內容感到疑惑。創建我的對象的副本

比方說,我有一個類foo和創建的對象foo first,並把一些數據吧:

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

然後我想創建另一個對象foo second並使其具有相同的內容(但不完全相同的內存位置)爲first。我可以做以下事情來實現嗎?

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

抑或這只是設置firstsecond到相同的內存地址,我只是有效地獲得存儲在單個對象上兩個手柄?

我讀過關於克隆物體的事情,它看起來太複雜了。我覺得自從我經歷了在foo second = new foo();中定義新的foo的麻煩之後,編譯器應該認識到second = first;意圖複製整個事物而不是指向第一個。它是如何工作的?

所以我的問題是:爲什麼這不是如何工作?上述編譯器如此設置的邏輯有什麼缺陷?

+2

「_我讀了克隆對象,看起來太複雜了 - 」 - 呃,我不敢說,你將不得不更多地瞭解它。雖然我會推薦一個[clone ctor](http://www.javapractices.com/topic/TopicAction.do?Id=12)over clone()'。我還建議你通過直接變量訪問使用[accessors/mutators](http://stackoverflow.com/a/15711958/2071828)。 –

+0

*「它是如何工作的?」*如果是這種情況,那麼爲什麼你認爲其他用戶寫了「複雜」的東西來克隆他們的對象? – Tom

+0

@Tom goot point!我想我的問題是關於「爲什麼這不是它的工作原理」? – Kagaratsch

回答

3

最好的方法是使用複製構造函數

當你看到有關clone()的討論是爲了這個,請注意它是非常有爭議和泄氣(谷歌,如果你想知道爲什麼)。值得注意的例外是:數組!

複製構造是這樣的:

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

Foo second = new Foo(first); 

在Foo的構造函數,另一個富,只需複製等領域,利用其複製contructors太多,如果他們是複雜的對象。

+0

這就是天才!謝謝。 – Kagaratsch

相關問題