包含对对象的引用的Java数组

时间:2018-12-10 15:40:17

标签: java arrays reference

我有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]访问对象。

3 个答案:

答案 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(参考)将被复制到elst[0]中。

elst[0]分开的变量,即使它们具有相同的值。更改其中一个的值(保留null引用)并不意味着自动更改另一个的值。

换句话说,当您执行lst[0] = e;时,并不意味着告诉lst[0]始终使用e拥有的值,而是应该看一下e保留的>当前值,然后复制该值(一次)。因此,当您以后更改e保留的值(甚至更改为null)时,它也不会更改lst[0]保留的值。