2

执行这行代码的预期行为是什么?:

Foo f = someOtherObject.getFoo(); //We get a reference of a Foo object from another class
f = new Foo();

someOtherObject.getFoo() 会返回新对象还是旧对象?如果我们将第二行代码更改为:

f = null;

someOtherObjct.getFoo() 会返回 null 还是旧对象?

4

6 回答 6

5

您可以将其f视为包含指向内存中某个对象的值。当您使用 重新分配ff = something,它只会更改内存中f指向的位置。

但这并不影响f最初指向的对象。

因此,在这两种情况下,getFoo()即使您重新分配,也会返回旧对象f(假设您的getFoo方法没有改变任何东西并且当然是一个简单的 getter)。

于 2013-08-05T16:58:53.530 回答
2

当您为 分配不同的值/对象时f,您只需让f指向不同的内存位置,f指向的内存不会改变。

Foo f = someOtherObject.getFoo();

f指向 someOtherObject.getFoo() 返回的对象(堆上的某个内存位置)

f = new Foo();

f指向一个新对象(堆上的另一个内存位置)

someOtherObject.getFoo() 会返回新对象吗?

不...因为我们没有改变someOtherObject

f = null;

someOtherObject.getFoo() 会返回 null 吗?

不...因为我们没有改变someOtherObject

于 2013-08-05T17:00:02.340 回答
1
Foo f = someOtherObject.getFoo(); //Assign f to value returned by getFoo()
f = new Foo();                    //Reassign f to newly constructed Foo object
f = null;                         //Reassign f to null

无论哪种情况,该getFoo()方法都不关心您分配给f.

于 2013-08-05T16:59:42.947 回答
0

f = nullgetFoo()无论如何都不会影响返回的对象。或f = new foo()就此而言。

在这两种情况下,我们只是改变了 f 持有的参考。

于 2013-08-05T16:58:53.560 回答
0

在这两种情况下,someOtherObject.getFoo()返回的值都不会受到影响。通过重新分配,f您重新分配f自己,而不是f先前持有的参考。

于 2013-08-05T17:00:13.887 回答
0

f 只是一个指向对象的指针,因此更改它指向的位置(f = 其他)不会更改它之前指向的对象。

示例:(f 是您拥有的那种指针)

f = existingobject;
f = otherobject;

这意味着 f 首先指向existingobject。执行下一行时, f 不再指向,existingobject而是现在指向otherobjectexistingobject完全不受影响。

于 2013-08-05T17:01:12.220 回答