我有EMP类的对象e。我将其添加到数组中,并将e的引用设置为null。
Emp e = new Emp();
Emp[] lst = new Emp[10];
lst[0] = e;
e = null;
System.out.println("Emp object = "+l[0]);
我所知道的是数组lst不包含实际的empolyee对象,而是对雇员对象的引用。因此,如果我将引用e设置为null,那么我们仍然如何使用lst [0]访问对象。
答案 0 :(得分:4)
e
也是对象的引用,或者确切地说是一个保存引用的变量。
因此,您有两个引用指向同一对象。您只能“无效化”第一个。真实对象仍然存在,并且由于仍通过该数组进行引用,因此垃圾收集器也不会收集该对象。
这就是全部。
答案 1 :(得分:3)
Emp e = new Emp(); // e points to some object
ListEmp lst = new ListEmp[10];
lst[0] = e; // lst[0] points to some object which is the same object pointed to by e
e = null; // here you are making e to point to null but lst[0] is still pointing to the object that was previously pointed to by e
e 和 lst [0] 都不是实际的对象。它们只是对同一对象的引用。因此,使引用为null不会使对象本身为null。因此,如果有对该对象的任何现有引用,它仍将保留在内存中。
答案 2 :(得分:2)
引用只是JVM用于标识和定位对象的数字。
Emp e = new Emp();
new Emp();
创建Emp
类的实例,并返回对该实例的引用-可以说它是123
。然后通过Emp e =
将该标识符分配给参考变量 e
,因此它保留了123。
后来在
lst[0] = e;
123
(参考)将被复制到e
到lst[0]
中。
但e
和lst[0]
是分开的变量,即使它们具有相同的值。更改其中一个的值(保留null
引用)并不意味着自动更改另一个的值。
换句话说,当您执行lst[0] = e;
时,并不意味着告诉lst[0]
始终使用e
拥有的值,而是应该看一下e保留的>当前值,然后复制该值(一次)。因此,当您以后更改e
保留的值(甚至更改为null
)时,它也不会更改lst[0]
保留的值。