2012-08-01 231 views
1

我目前正在創建一個Android應用程序,並認爲我有一個saving data internally等問題。事實證明,問題與此無關,但與我對Java的理解有關。Java對象混淆

的問題是,當我做

myObject1 = myObject2;

myObject3使用myObject1這可能是一個列表,或任何(對我來說一個Hashtable),然後改變myObject2myObject3得到相應的改變,以及。這是什麼叫,我在哪裏可以瞭解更多?如何將myObject2指定爲myObject1以便myObject1完全「獨立」?

回答

5

作爲Java中的對象的變量稱爲引用,並且引用到內存中的相同位置。如果您希望使用new關鍵字,爲您的機器分配內存,則需要兩個相同類型的內存不需要指向內存中相同位置的對象

以下兩個變量myObject1和myObject2是一個OBJECT1對象引用,但不會在同一個內存位置存在:

OBJECT1 myObject1 = new OBJECT1(); 
OBJECT1 myObject2 = new OBJECT1(); 

如果分配對象到另一個是很重要的,你可以看看到clone()方法或者使用拷貝構造函數:如果你考慮的聲明

public OBJECT1(OBJECT1 toCopy) 
{ 
    this.field1 = toCopy.field1; 
    this.field2 = toCopy.field2; 
    this.field3 = toCopy.field3; 
    this.field4 = toCopy.field4;  
} 
+0

謝謝,現在我明白了! – sk1ll3r 2012-08-01 13:04:10

+0

還有一個問題:如果我的OBJECT1是一個2D數組,那麼是什麼? – sk1ll3r 2012-08-01 13:08:50

+0

@ sk1ll3r你想執行類似的複製?然後,您必須遍歷所有行和列,並將它們複製到新數組中的對應值。這裏有一個很好的帖子,有一個例子:http://stackoverflow.com/questions/5617016/how-do-i-copy-a-2-dimensional-array-in-java – 2012-08-01 13:13:46

4

這些變量是引用到一個對象;將每個變量看作字符串的結尾。另一端綁在一個物體上。如果你分配一個變量,你將一個新的字符串綁定到一個對象上。

要創建副本,您(意外)需要創建副本。有時,這很簡單:有可能是一個拷貝構造函數,可以讓你做到這一點:

ArrayList<String> copy = new ArrayList<String>(oldArrayList); 

其他時候,你可能會使得複製的方法;例如,一些類實現clone()方法:

Foo copy = (Foo) otherFoo.clone(); 

你只需要學習一類的API,以找到一種方法來複制對象。

+0

雖然「ArrayList」的拷貝構造函數可能會創建「oldArrayList」的新副本(即列表),但它並不一定會爲您提供'oldArrayList'中元素的新副本。執行'copy.get(0).someOperation()'可能會根據複製構造函數的定義如何回寫到'oldArrayList'元素0。 – 2012-08-01 12:52:01

+0

事實上,它不會複製元素,只是列表本身,所以您可以在一個副本中添加和刪除元素,而不會影響另一個元素中的元素的數量或順序。 – 2012-08-01 12:55:33

1

這取決於myObject是什麼。如果您想獲得精確的副本,則您正在尋找的字詞是clone。但並非所有的對象都支持克隆,因此您可能必須構建您自己的克隆方法(作爲@Hunter)指出需要通過new關鍵字分配新內存。

0
在Java或任何OOP語言

所以

Object obj = new Object() 

OBJ被稱爲其實際指向哪裏實際對象的存儲位置的手柄。

所以當你,如果你做obj1.setSomething()obj1 = obj你得到2個把手這實際上是指向同一個位置

因此它將在obj.getSomething()呼叫也有所體現。

0

變量包含引用到對象。在其他語言中,參考文獻通常被稱爲指針。這樣做myObject1 = myObject2;使得myObject1變量引用與myObject2變量相同的對象。

如果你想使一個對象的副本,最好的辦法是使用拷貝構造函數來實現它自己,例如:

public MyClass(MyClass other) { 
    this.foo = other.foo; 
    this.bar = other.bar; 
    ... 
} 

,因此做

myObject1 = new MyClass(myObject2); 
0

當你將一個對象o1分配給另一個對象o2,使o2指向o1。所以無論何時你改變對象o1對象o2都相應地改變。

它發生與列表中的對象相同。這是因爲在Java中,當你將對象分配給另一個對象時,你不會複製內容,但它就像你「分享」它。

創建另一個獨立於所有對象的唯一方法是使用新的然後複製每個屬性。