执行这行代码的预期行为是什么?:
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 = nullgetFoo()无论如何都不会影响返回的对象。或f = new foo()就此而言。
在这两种情况下,我们只是改变了 f 持有的参考。
在这两种情况下,someOtherObject.getFoo()返回的值都不会受到影响。通过重新分配,f您重新分配f自己,而不是f先前持有的参考。
f 只是一个指向对象的指针,因此更改它指向的位置(f = 其他)不会更改它之前指向的对象。
示例:(f 是您拥有的那种指针)
f = existingobject;
f = otherobject;
这意味着 f 首先指向existingobject。执行下一行时, f 不再指向,existingobject而是现在指向otherobject。existingobject完全不受影响。