0

基本的に、学生をクラスリストに追加したいと考えています。次のコードがあると仮定します

public class ClassList {

    //Constructor methods...


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

    public boolean addStudent (Student newStudent)
    {

        studList[14] = newStudent;
    }
}

スタッドリスト [14] は、newStudent オブジェクトへの参照を追加するか、そのオブジェクトをスタッドリスト [14] 学生オブジェクトにコピーしますか?

私が理解している限り、メソッドaddStudent()が2回目に呼び出されると、newStudentオブジェクトは削除されます。それでは、studList[14] は null を指しますか? コードの実行中ずっと stdList[14] を保持したい場合はどうすればよいですか?

わかりにくい場合は申し訳ありませんが、クエリを簡単に説明する方法がわかりません...

4

3 に答える 3

2

Java には、理解しておかなければならない基本的な規則が 1 つあります。

オブジェクトにアクセスできる唯一の方法は、その参照を介することです。また、変数が保持できる唯一の値は参照(*)です。これは、ローカル変数、パラメーター、インスタンス フィールド、および静的フィールドにも当てはまります。この点では、それらはすべて同じです。

オブジェクト自体が変数に「含まれる」ことはありません。

これは、最初の質問に対する答えに直接つながります。

参照は配列にコピーされます(配列は参照(*)のみを保持でき、objectsは保持できないため)。

newStudentこれは、「削除される」ことは実際には大したことではないことも意味します。これは、同じオブジェクトへの別の参照にすぎず、削除されても何も起こりません。

現在、特定のオブジェクトへのすべての参照が削除された (またはアクセスできなくなった) 場合、オブジェクト自体がガベージ コレクションの対象になりますが、それは悪いことではありません。

(*) ... またはプリミティブな値ですが、この議論ではそれらを無視します。

于 2013-10-31T08:21:01.183 に答える
0

タイプ、値、および変数については、JLS を参照してください。

参照型の値は、オブジェクトへの参照です。

オブジェクトへの残りの参照 (弱いものは別として) がない場合、そのオブジェクトはヒープからガベージ コレクションされます。

2 回呼び出した場合:addStudent(new Student()); 最初に作成された Student オブジェクトは、オブジェクトを「指している」他の参照変数がないため、GC の対象となります。

于 2013-10-31T08:28:28.893 に答える
0

代入はオブジェクトをコピーしません。オブジェクトへの参照を配列に追加するだけです。

オブジェクトへの参照がどこにもなくなると、オブジェクトはガベージ コレクターによって削除されます。ほとんどの場合、このプロセスは目に見えないため、あまり心配する必要はありません。オブジェクトへの参照がなくなったら、とにかくそれを使用することはできませんでした。

おそらくint、常にエントリ番号 14 を設定するのではなく、メソッドに を渡して、配列内のどのエントリを設定するかを伝えたいと思いませんか?

于 2013-10-31T08:16:14.340 に答える