将对象存储在对象数组中

时间:2013-10-31 08:13:25

标签: java oop object

基本上我想将学生添加到班级列表中。假设我有以下代码

public class ClassList {

    //Constructor methods...


    private Student [] studList = new Student [20];

    public boolean addStudent (Student newStudent)
    {

        studList[14] = newStudent;
    }
}

studList [14]是否添加对newStudent对象的引用或将该对象复制到studList [14]学生对象中?

据我所知,当第二次调用addStudent()方法时,newStudent对象将被删除。那么studList [14]会指向null呢?如果我希望studList [14]在整个代码执行过程中持续存在怎么办?

很抱歉,如果难以理解,我不知道如何更容易解释我的查询......

3 个答案:

答案 0 :(得分:2)

Java中有一条基本规则,你必须解决这个问题:

您可以访问对象的唯一方式是通过其引用。变量可以容纳的唯一引用 (*)。对于局部变量,参数,实例字段和静态字段都是如此:它们在这方面都是相同的。

对象本身永远不会“包含”在变量中。

这直接导致您对第一个问题的回答:

引用被复制到数组中(因为数组只能 保持引用(*),永远不会对象)。

这也意味着“newStudent被删除”实际上并不是什么大问题:它只是对同一个对象的另一个引用,如果它消失了就没有什么事情发生了。

现在,如果对给定对象的所有引用都被删除(或者不再可访问),那么对象本身就有资格进行垃圾回收,但这不是坏事,因为你无法访问无论如何它已经。

(*)...或原始值,但我们会忽略这些讨论。

答案 1 :(得分:0)

分配不会复制对象。它只是将对象的引用添加到数组中。

垃圾收集器在任何地方都没有对它进行任何引用后,对象将被删除。你不需要过多担心这个过程,因为它在大多数时候都是看不见的;一旦没有对象的引用,你就无法使用它。

也许您希望能够将int传递给您的方法,告诉它要设置数组中的哪个条目,而不是始终设置条目号14?

答案 2 :(得分:0)

您应该查看JLS about types, values and variables

  

引用类型的值是对象的引用。

如果对象没有剩余的引用(除了弱引用),它将被从堆中垃圾收集。

如果您拨打两次电话:addStudent(new Student()); 创建的第一个Student对象符合GC的条件,因为没有其他引用变量“指向”该对象。