使用参考和新的

时间:2013-08-05 16:56:37

标签: java

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

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,还是旧对象?

6 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

Foo f = someOtherObject.getFoo();

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

f = new Foo();

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

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

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

f = null;

someOtherObject.getFoo()会返回null吗?

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

答案 2 :(得分: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的内容。

答案 3 :(得分:0)

无论如何,

f = null不会影响getFoo()返回的对象。 或者f = new foo()就此而言。

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

答案 4 :(得分:0)

在这两种情况下,someOtherObject.getFoo()返回的值不受影响。通过重新分配f,您需要重新分配f本身,而不是f以前持有的引用。

答案 5 :(得分:0)

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

实施例: (f是你的指针)

f = existingobject;
f = otherobject;

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