基本上我想将学生添加到班级列表中。假设我有以下代码
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]在整个代码执行过程中持续存在怎么办?
很抱歉,如果难以理解,我不知道如何更容易解释我的查询......
答案 0 :(得分:2)
Java中有一条基本规则,你必须解决这个问题:
您可以访问对象的唯一方式是通过其引用。变量可以容纳的唯一值是引用 (*)。对于局部变量,参数,实例字段和静态字段都是如此:它们在这方面都是相同的。
对象本身永远不会“包含”在变量中。
这直接导致您对第一个问题的回答:
引用被复制到数组中(因为数组只能 保持引用(*),永远不会对象)。
这也意味着“newStudent
被删除”实际上并不是什么大问题:它只是对同一个对象的另一个引用,如果它消失了就没有什么事情发生了。
现在,如果对给定对象的所有引用都被删除(或者不再可访问),那么对象本身就有资格进行垃圾回收,但这不是坏事,因为你无法访问无论如何它已经。
(*)...或原始值,但我们会忽略这些讨论。
答案 1 :(得分:0)
分配不会复制对象。它只是将对象的引用添加到数组中。
垃圾收集器在任何地方都没有对它进行任何引用后,对象将被删除。你不需要过多担心这个过程,因为它在大多数时候都是看不见的;一旦没有对象的引用,你就无法使用它。
也许您希望能够将int
传递给您的方法,告诉它要设置数组中的哪个条目,而不是始终设置条目号14?
答案 2 :(得分:0)
您应该查看JLS about types, values and variables:
引用类型的值是对象的引用。
如果对象没有剩余的引用(除了弱引用),它将被从堆中垃圾收集。
如果您拨打两次电话:addStudent(new Student());
创建的第一个Student对象符合GC的条件,因为没有其他引用变量“指向”该对象。