2013-04-16 35 views
0

在下面的代碼部分中,我應該有一個帶有不同xValues的Objs的ArrayList。相反,當我在第四行設置Obj n的xValue時,ArrayList中所有具有相同名稱的Objs都會將xValue設置爲相同的值。在對象上設置屬性重置ArrayList中類似對象的相同屬性

Obj n = new Obj(); 
n = getObj(event.getX(), event.getY(), view.getHeight(), view.getWidth(), view); 

n.setXValue(view.getWidth()); 

if (currentMode == AppMode.MODE.code && n != null) { 
    if (event.getAction() == MotionEvent.ACTION_MOVE) { 
     arraylist.add(n); 
    } // end if (event.getAction 
} 

我在做什麼錯?有沒有一個集合可以讓我設置對象的屬性而不會搞亂集合中其他對象的屬性?

+0

如果不顯示'Obj'類,就不能指望好的調試。我看到一件奇怪的事情:在第一行中,您創建了一個新的'Obj',但是您立即將它扔掉,並用'getObj(...)'的結果替換它。爲什麼? –

回答

1

Java是一種「傳遞按引用」的語言,當涉及到的對象。當您將相同的對象放在兩個不同的集合中時,您只是將指針傳遞給每個集合的內存中的相同位置,所以您從一個引用做出的任何更改都會影響另一個引用。

如果您不希望出現這種情況,則必須先使用Object.clone()在將對象放入新集合之前製作對象的副本,或者使用其他類似的複製技術。

+0

這就是問題所在,非常感謝! – JulioM

+0

不能投票,沒有足夠的聲譽:對不起! – JulioM

0

我猜你寫了Obj,在Obj中有一個名爲類似XValue的靜態變量。

當您將一個變量指定爲靜態變量時,您將獲得該變量的所有實例之間共享的該變量的唯一實例,因此:此行爲。

或者說,(他是正確的)什麼torquestomp說

+0

不,xValue不是靜態的,並且xValue不會重置所有Objs,只是具有相同'name'屬性的xValue。 – JulioM