2013-03-10 81 views
0

我想我沒有正確理解java與對象引用一起工作的方式。在這裏,我已經意識到東西問題的例子是行不通的,因爲我想:Java對象引用問題

public void UnequipObject(int index) { 

    UsableItem ui = null; 

    if(index == 0) ui = item1; 
    else if(index == 1) ui = item2; 
    else if(index == 2) ui = item3; 

    if(ui != null) 
    { 
     int itemId = ui.GetId();    
     State.Instance().AddItem(itemId, 1);    
     ui = null; 
    } 
} 

功能unequip一個字符的對象(我正在開發一個視頻遊戲)。每個角色最多有三個對象。爲了使它更通用,使用給定的索引,可以解除該對象。爲此,我在UI中複製我想解開的對象,以便對其進行更改。國家在這裏並不重要。關鍵是,當我做「ui = null」的分配時,它被認爲原來的對象也是空的,因爲我認爲在將對象分配給ui的那一刻,兩者都是相同的參考,你可以編輯任何兩個變化將同時影響兩個...

有沒有人可以幫我解決這個錯誤?謝謝!

+1

您只是將兩個引用中的一個置空,另一個仍然有效。在任何兩個引用上調用方法都會改變原始對象中的數據(這兩個引用都是)。 – 2013-03-10 00:21:36

回答

1

ui是一個局部變量。您只將這個變量設置爲null。您不會影響代碼中的任何其他變量。稍後,您將ui指定爲其他項目之一,然後執行相關操作。

在附註中,我強烈建議您使用數組或列表。這樣可以更容易地檢索項目(一行,而不是一堆if..else if..else's)。如果您將來決定這麼做,它還會使更容易在庫存中添加更多「插槽」。

+0

是的,好吧,這是有原因的。關於錯誤理解,是的,我想我對參考文獻的想法太多了。它很有禮貌! – Frion3L 2013-03-10 00:25:48

0

您不能將對象設置爲null。是的,您將ui設置爲null,但ui只是對象的一個​​引用(可能有其他引用的是原始對象)。對象本身不受此影響。

只有當沒有對原始對象的引用時,它纔會被垃圾收集。