执行这行代码的预期行为是什么?:
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 还是旧对象?
执行这行代码的预期行为是什么?:
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 还是旧对象?
您可以将其f
视为包含指向内存中某个对象的值。当您使用 重新分配f
时f = something
,它只会更改内存中f
指向的位置。
但这并不影响f
最初指向的对象。
因此,在这两种情况下,getFoo()
即使您重新分配,也会返回旧对象f
(假设您的getFoo
方法没有改变任何东西并且当然是一个简单的 getter)。
当您为 分配不同的值/对象时f
,您只需让f
指向不同的内存位置,f
指向的内存不会改变。
Foo f = someOtherObject.getFoo();
f
指向 someOtherObject.getFoo() 返回的对象(堆上的某个内存位置)
f = new Foo();
f
指向一个新对象(堆上的另一个内存位置)
someOtherObject.getFoo() 会返回新对象吗?
不...因为我们没有改变someOtherObject
f = null;
someOtherObject.getFoo() 会返回 null 吗?
不...因为我们没有改变someOtherObject
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
.
f = null
getFoo()
无论如何都不会影响返回的对象。或f = new foo()
就此而言。
在这两种情况下,我们只是改变了 f 持有的参考。
在这两种情况下,someOtherObject.getFoo()
返回的值都不会受到影响。通过重新分配,f
您重新分配f
自己,而不是f
先前持有的参考。
f 只是一个指向对象的指针,因此更改它指向的位置(f = 其他)不会更改它之前指向的对象。
示例:(f 是您拥有的那种指针)
f = existingobject;
f = otherobject;
这意味着 f 首先指向existingobject
。执行下一行时, f 不再指向,existingobject
而是现在指向otherobject
。existingobject
完全不受影响。