我在Java中做以下语句,
Obj t[] = new Obj[10]; Obj a = new Obj("a"); t[0] = a; a = new Obj("b"); t[1] = a;
为什么在java中,当我访问t [0]时,它返回"a"而不是"b"?这是因为GC吗?我能相信做这样的手术是安全的
这正是发生了什么.
Obj t[] = new Obj[10]; // 1 Obj a = new Obj("a"); // 2 t[0] = a; a = new Obj("b"); // 3 t[1] = a; // 4
您创建一个数组,可以容纳10个实例的引用Obj
.叫这个obj01
.你分配给它t
.请注意,变量t
和实际对象obj01
具有非常随意的关系.
你创建一个实例Obj
,调用它obj02
.您将此对象的引用分配给变量a
.请注意,变量a
和实际对象obj02
具有非常随意的关系.
你也把这个参考t[0]
.你有两个地方知道一个对象.对象obj02
(具有值"a"
)被称为a
并且也称为t[0]
.
你创建一个实例Obj
,调用它obj03
.您将此新对象的引用分配给旧变量a
.请注意,变量a
和实际对象obj03
具有非常随意的关系. a
用于引用obj02
,但它不再引用它.
所以,obj01
(一个数组)被引用t
; obj02
(和实例Obj
)被称为t[0]
; obj03
(一个例子Obj
)被称为a
.
你把引用a
放进去了t[1]
.所以,t[1]
得到一个参考obj03
.
此时,所有对象都由范围内的变量引用.由于所有对象都有引用,因此无法对其进行垃圾回收.
问题是,Java没有指针.
将一个对象变量分配给另一个时,它会更改该变量指向的内容,但不会更改您可能拥有的任何其他引用.
所以:
Object a = new Object("a"); Object b = new Object("b"); a = b; b = new Object("c"); // At this point, a = "b" // and b = "c"
如您所见,虽然您首先设置a = b,但是当您将b设置为新对象时,仍会保留对旧对象的引用.