Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在对象数组中存储对象_Java_Oop_Object - Fatal编程技术网

Java 在对象数组中存储对象

Java 在对象数组中存储对象,java,oop,object,Java,Oop,Object,基本上,我想将学生添加到班级列表中。假设我有以下代码 public class ClassList { //Constructor methods... private Student [] studList = new Student [20]; public boolean addStudent (Student newStudent) { studList[14] = newStudent; } } studList[14

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

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]在整个代码执行过程中保持不变,该怎么办


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

作业没有复制对象。它只是将对象的引用添加到数组中

在任何地方都没有对对象的引用后,垃圾收集器将删除该对象。你不必太担心这个过程,因为它大部分时间是看不见的;一旦没有对象的引用,你就不能使用它了


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

Java中有一条基本规则,您必须仔细考虑:

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

对象本身从不“包含”在变量中

这将直接引出您第一个问题的答案:

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


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

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


(*)。。。或基本值,但我们将忽略这些值进行讨论。

您应该看看:

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

如果一个对象没有剩余的引用(弱引用除外),它将从堆中被垃圾回收

如果调用两次:
addStudent(newstudent())

创建的第一个Student对象符合GC条件,因为没有其他引用变量“指向”该对象。

您拥有的是一个Student数组,您需要知道当前添加的元素的索引。如果你想要一个列表,你应该检查具体的列表实现:“它只是对同一个对象的另一个引用,如果它消失了,就不会发生什么事情。”所以说,我调用addStudent的次数越多,分配的内存就越多(前提是我不断向数据添加新的引用),这样说对吗?因为实际数据没有被删除…@kype:没有。读最后一段。如果没有对
Student
对象的其他引用,它最终将被垃圾收集。由于您将所有学生存储在数组的同一个插槽中,下一个学生只会覆盖对当前学生的引用。一般来说:如果创建新对象并使用一些可访问的引用保留它们,则内存使用会增加。在短期内,仅仅创建对象并丢弃对它们的引用就可以略微增加内存使用量(也就是说,直到GC清理掉这些混乱),但在长期内不会这样做;我只是添加了一个新的引用,因此数据将被保留在方法调用之外,因为我有一个不会被删除的新引用?是的,没错。当然,除非您稍后去覆盖引用。