执行此行代码的预期行为是什么?:
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,还是旧对象?
答案 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
,但现在指向otherobject
。 existingobject
完全不受影响。