2013-03-10 78 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只是对象的一个​​引用(可能有其他引用的是原始对象)。对象本身不受此影响。

只有当没有对原始对象的引用时,它才会被垃圾收集。