簡體   English   中英

Java對象混亂

[英]Java objects confusion

我目前正在創建一個Android應用程序,並認為我在內部保存數據等存在問題。事實證明,問題與該問題無關,但與我對Java的理解有關。

問題是當我這樣做

myObject1 = myObject2;

並使用myObject1myObject3這可能是一個列表,或任何(對我來說一個Hashtable),然后改變myObject2myObject3得到相應的改變,也是如此。 這叫什么,在哪里可以了解更多? 我該如何分配myObject2myObject1使myObject1完全“獨立”?

在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;     
}

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

要創建副本,您(毫無疑問)需要創建一個副本。 有時,這很容易:可能有一個復制構造函數可讓您執行以下操作:

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

有時,您可能是制作副本的方法。 例如,某些類實現了clone()方法:

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

您只需要研究類的API即可找到復制對象的方法。

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

所以用Java或任何OOP語言

如果您考慮該聲明

Object obj = new Object()

obj稱為句柄,它實際上指向實際對象存儲的位置。

因此,當您執行obj1 = obj您將獲得2個實際上指向相同位置的句柄

因此,如果執行obj1.setSomething()它也會反映在obj.getSomething()調用中。

變量包含對對象的引用 在其他語言中,引用通常稱為指針 這樣做myObject1 = myObject2; 使得myObject1變量引用相同的對象作為myObject2變量。

如果要復制對象,最好的方法是自己實現,例如使用復制構造函數:

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

因此做

myObject1 = new MyClass(myObject2);

當將對象o1分配給另一個對象o2時,會使o2指向o1。 因此,無論何時更改對象o1,對象o2都會相應更改。

列表中的對象也是如此。 這是因為在Java中,當您將一個對象關聯到另一個對象時,您不會復制內容,而是像“共享”它一樣。

從一切創建另一個獨立的對象的唯一方法是使用new ,然后復制每個屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM