如何将引用从一个对象移动到另一个对象?

时间:2013-10-29 12:16:38

标签: java object reference

我正在尝试将对象的引用从一个对象移动到另一个对象,从而在移动对象时删除对象的引用,并将对象的引用添加到它移动到的对象。

我会尝试使用一些假类来尽可能地设置场景:Frog,Owner,Customer:D

所以我有一个拥有青蛙集合的所有者,这些可以借给客户。客户只能参考一只青蛙。因此,当青蛙被借出时,可以在Customer类中创建对Frog的引用,并且可以从Frogs的所有者集合中删除Frog。

我想知道的是我如何扭转这一行动。当我希望客户给青蛙回来时,我可以为Customer引用Frog null的实例变量,但是我不知道如何在没有引用它的情况下将这个Frog返回给所有者,例如:< / p>

public void returnFrog()
{
owner.returnFrog(frog);
frog = null;
}

只要我将实例变量设为null,返回给所有者的引用也将变为null。

我能想到这样做的唯一方法是让客户拥有一个Frog的List,只需将一个Frog从List中移除。这样,引用永远不会设置为null,但是有更好的方法吗?我坚持认为如果我只需要一个值,我就不应该使用List。 :(

或者我无法移动物体,只是跟踪青蛙是否与客户相关联 - 如果是,则无法链接到任何其他客户(这是我的解决方案)。 / p>

希望我不会错过一些基本的东西。

2 个答案:

答案 0 :(得分:1)

上面的代码有效,您的期望可能是错误的:方法returnFrog()将引用frog(=变量frog指向的实例)添加到青蛙列表中在owner实例中。

之后为变量frog分配新值对returnFrog()内执行的代码没有影响。

当您将frog视为实例的别名时,这变得更加清晰:

Frog a = new Frog();
b = a; // doesn't copy the frog
b = null; // doesn't change a

这不会复制青蛙;仍然只有一个实例,但在不同的时间,您有不同的变量包含指向此实例的引用。但更改引用b不会影响a,因为将实例分配给引用不会更改实例;它只是改变了参考。

答案 1 :(得分:1)

我认为你误解了变量和引用是如何工作的。

这一行:

frog = null;

将值null赋给变量frog,我假设它是Customer类的实例变量。 它不会影响任何其他变量!

所以,如果这一行:

owner.returnFrog(frog);

结束将对有问题的两栖动物的引用存储到Owner中的变量中,然后在User中将变量赋值为空后,该引用仍将存在。

一个物理比喻是在纸上写下建筑物的地址。假设你有一张纸上有一个好发型师的地址,我有一张白纸。你告诉我地址​​,然后我把它写下来。现在你擦掉你的纸。我的那张纸是否空白了?