我正在尝试将对象的引用从一个对象移动到另一个对象,从而在移动对象时删除对象的引用,并将对象的引用添加到它移动到的对象。
我会尝试使用一些假类来尽可能地设置场景: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>
希望我不会错过一些基本的东西。
答案 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
中将变量赋值为空后,该引用仍将存在。
一个物理比喻是在纸上写下建筑物的地址。假设你有一张纸上有一个好发型师的地址,我有一张白纸。你告诉我地址,然后我把它写下来。现在你擦掉你的纸。我的那张纸是否空白了?