0

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

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] 在整个代码执行过程中持续存在怎么办?

对不起,如果很难理解,我不知道如何更容易地解释我的查询......

4

3 回答 3

2

Java 中有一条基本规则,您必须牢记:

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

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

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

引用被复制到数组中(因为数组只能保存引用(*),不能保存objects)。

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

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

(*) ... 或原始值,但我们将在本次讨论中忽略这些。

于 2013-10-31T08:21:01.183 回答
0

你应该看看关于类型、值和变量的 JLS

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

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

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

于 2013-10-31T08:28:28.893 回答
0

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

在任何地方都没有对它的引用后,垃圾收集器会删除一个对象。你不需要太担心这个过程,因为它大部分时间都是不可见的;并且一旦没有对对象的引用,您无论如何都无法使用它。

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

于 2013-10-31T08:16:14.340 回答