2013-10-31 157 views
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]在整个代码执行过程中持续存在,该怎么办?

很抱歉,如果这是很难理解的,我不知道怎么解释我的查询更容易...

+0

你在那里有一组学生,你需要知道你正在添加的元素的索引。如果你想要一个列表,你应该检查特定的List实现:http://docs.oracle.com/javase/7/docs/api/java/util/List.html – Morfic

回答

2

有在Java中一个基本的规则,你必须绕到你的头:

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

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

这直接导致了回答你的第一个问题:

参考被复制到阵列(作为一个数组可以只有保持引用(*),从来没有对象)。

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

,如果所有引用给定对象被删除(或不再可达),那么物体本身成为垃圾收集,但是这并不是一件坏事,因为你不能再访问也无妨。

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

+0

“这只是对同一个对象的另一个引用,如果它消失了,没有什么会发生。” 因此,说我越来越多地调用addStudent,越来越多的内存得到分配(只要我不断添加对数据的新引用)?因为实际的数据不会被删除... – kype

+0

@kype:没有。阅读最后一段。如果没有其他对“学生”对象的引用,它最终将被垃圾收集。而且,由于您将所有学生存储在数组的相同位置*,下一个只会覆盖对当前位置的引用。一般来说:如果你创建新的对象,* **和** *会保留一些可达的引用,所以内存使用量会增加。只需创建对象并放弃对它们的引用,就可以在短期内稍微增加内存使用量(即,直到GC清理那些混乱的内容),但从长远来看不会这样做。 –

0

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

一个对象被垃圾收集器删除后,没有更多的引用到任何地方。你不必过分担心这个过程,因为它大部分时间都是不可见的。一旦没有对象的引用,就无法使用它。

也许你想能够通过一个int您的方法,告诉它要设置的数组中的哪个条目,而不是总是设置条目号14?

+0

所以当我做这个studList [14] = newStudent ;即时通讯只是添加一个新的参考,因此数据将保存超越方法调用,因为我有这个新的参考,不会被删除? – kype

+0

是的,没错。当然,除非你晚点去覆写参考。 –

0

你应该看看JLS about types, values and variables

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

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

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