1

認定試験の準備をしていますが、次のコードがわかりません:

主要:

public class TestStudent {
    public static void main(String[] args) {
        Student bob = new Student();
        Student jian = new Student();
        bob.name = "Bob";
        bob.age = 19;
        jian = bob;
        jian.name = "Jian";
        System.out.println("Bob's Name: " + bob.name);
    }
}

クラス:

public class Student {
    public String name = "";
    public int age = 0;
    public String major = "Undeclared";
}

「Bob's Name: Jian」と出力されるのはなぜですか?

Bob.name が Jian に設定されたことはありません。明らかに、「jian = bob;」が原因であるに違いありません。しかし、それはjian変数をbobと同じに設定するだけだと思いました。この概念は何と呼ばれ、Java チュートリアルのどこで説明されていますか?

4

6 に答える 6

3

Java での割り当ては、オブジェクトをコピーするのではなく、参照をコピーします。この任務の後

jian = bob;

yourは、割り当てて割り当て jianたオブジェクトを指しなくなりました。同じオブジェクトにエイリアスを作成するのと同じです。オリジナルは取り返しのつかないほど失われ、ガベージ コレクションの対象になります。Studentjianbobjian

次のアセンション

    jian.name = "Jian";

bobエイリアスを介して変数の名前を上書きし、jian表示される結果につながります。

于 2012-08-09T19:05:57.313 に答える
2

コード `"jian = bob;" を見てください。bob オブジェクトの参照を変更して jian に設定しました。
次に、 jian.name = "Jian" を設定すると、ボブオブジェクトも変更されます

于 2012-08-09T19:06:27.580 に答える
1

これは Java の基本的な概念です。すべてのオブジェクト変数(Java クラスのインスタンスを表すbobやなどのオブジェクト)は参照です。この概念は、C などの言語ではポインターとも呼ばれます。jian

これはbob、概念的には、変数がnameageおよびmajorフィールドの値を保持するのではなく、データを保持するメモリ内の場所を指すことを意味します。したがって、オブジェクト参照変数で代入演算子 (=シンボル) を使用すると、その変数が指すメモリの部分を変更するだけです。だから行:

bob = jian

は、変数がと同じメモリ領域をbob参照するようになったことを意味し、一方で行うことはすべて他方に反映されます。jian

これにより、ボブのデータを保持するメモリ領域に何が起こったのかという興味深い疑問が残ります。それへの参照がなくなったため、メモリ内のどこかにまだ存在していても、それを取得することはできなくなりました (ただし、Java はすぐにそれを認識してクリアします -ガベージ コレクションとして知られています)。

とにかく、この種の概念は図で表現したほうがよいので、Java の公式ドキュメントまたはこのチュートリアルを参照することをお勧めします。

于 2012-08-09T19:17:47.817 に答える
1

オブジェクト参照はjianオブジェクト参照と同じメモリ部分を指すようになりましたbob。そのため、それらの1つを変更すると、両方に影響します。これは、それらが同じオブジェクトであるためです。

于 2012-08-09T19:06:21.340 に答える
1

これは、boband jian(Java のすべての非プリミティブ変数と同様) がオブジェクトではなく参照 (オブジェクトへのポインター) であるためです。だからあなたが言うときjian = bob;、それはjianと同じオブジェクトを指していますbob

于 2012-08-09T19:08:07.963 に答える
0

変数 bob と jian はオブジェクト参照です。http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.htmlを参照してください。

この記事には、あなたと同様の例が含まれています: http://www.informit.com/articles/article.aspx?p=174371&seqNum=4

于 2012-08-09T19:08:47.197 に答える