我在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设置为新对象时,仍会保留对旧对象的引用.
归档时间: |
|
查看次数: |
5357 次 |
最近记录: |