我在Java中做以下语句,
Obj t[] = new Obj[10];
Obj a = new Obj("a");
t[0] = a;
a = new Obj("b");
t[1] = a;
Run Code Online (Sandbox Code Playgroud)
为什么在java中,当我访问t [0]时,它返回"a"而不是"b"?这是因为GC吗?我能相信做这样的手术是安全的
S.L*_*ott 10
这正是发生了什么.
Obj t[] = new Obj[10]; // 1
Obj a = new Obj("a"); // 2
t[0] = a;
a = new Obj("b"); // 3
t[1] = a; // 4
Run Code Online (Sandbox Code Playgroud)
您创建一个数组,可以容纳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.
此时,所有对象都由范围内的变量引用.由于所有对象都有引用,因此无法对其进行垃圾回收.
小智 6
问题是,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"
Run Code Online (Sandbox Code Playgroud)
如您所见,虽然您首先设置a = b,但是当您将b设置为新对象时,仍会保留对旧对象的引用.