0
int i = 0;
int j = i;
System.out.println("initial int: " + j); // 0

Integer ii = new Integer(0);
Integer jj = ii;
System.out.println("initial Integer: " + jj); // 0

String k = new String("s");
String l = k;
System.out.println("initial String: " + l); // "s"

Person person1 = new Person("Furlando"); // from constructor -> publ. instance var. 'name'
Person person2 = person1;
System.out.println("initial Person: " + person2.name); // "Furlando"

/*--------------------*/
System.out.println();
/*--------------------*/

i += 1;
System.out.print("added 1 to int: [" + i);
System.out.println("], and primitive which also \"refers\" to that (has a copy, actually), has a value of: [" + j + "]");

ii += 1;
System.out.print("added 1 to Integer object: [" + ii);
System.out.println("], and object which also refers to that, has a value of: [" + jj + "]");

k += "tring";
System.out.print("added \"s\" to String object: [" + k);
System.out.println("], and object which also refers to that, has a value of: [" + l + "]");

person1.name = "Kitty";
System.out.print("changed instance variable in Person object to: [" + person1.name);
System.out.println("], and object which also refers to that, has a value of: [" + person2.name + "]");

/* [COMPILER OUTPUT]
    initial int: 0
    initial Integer: 0
    initial String: s
    initial Person: Furlando

    A) added 1 to int: [1], and primitive which also "refers" to that (has a copy, actually), has a value of: [0]
    B) added 1 to Integer object: [1], and object which also refers to that, has a value of: [0]
    C) added "s" to String object: [string], and object which also refers to that, has a value of: [s]
    D) changed instance variable in Person object to: [Kitty], and object which also refers to that, has a value of: [Kitty]
*/

A は理解しています。そこにプリミティブがあります。参照なし。コピーによる。
私は、B と C が D と同じように動作することを望みました - 与えられた参照に従って変更します。

この別のオブジェクトへのオブジェクト参照が、整数や文字列などではなく、ユーザー定義オブジェクトでのみ「機能する」のはなぜですか?



回答ありがとうございます - 今ではわかりました!

4

4 に答える 4

3

StringIntegerオブジェクトは Java では不変です。行う場合:ii += 1またはk += "tring"、新しいオブジェクトを作成します。古いオブジェクトへの変数jjlポイント。だからこそ、価値観が違うのです。

于 2013-04-28T10:11:01.050 に答える
0

この動作は、ユーザー定義オブジェクト対内部に関するものではなく、「整数」および「文字列」(および他のすべてのプリミティブ ラッパー) オブジェクトが非常に特別に処理されるという事実です。整数はプリミティブ整数の単なる「ラッパー」であるため、その動作は真の「参照型」ではありません。これらのラッパー オブジェクトはすべて不変に実装されています。Integer への同じ参照が別の値を持つことはありません。

補足: これらのラッパー オブジェクトは、必要に応じて自動的にプリミティブ型にキャストされるため、一般的な使用では速度が低下します。それらの利点は、null にすることができることです。

于 2013-04-28T10:10:58.993 に答える
0

これは、+=オペレーターの作業に関係しています。

あなたが実際に行っているのは、呼び出し時に値を再割り当てすることです+=

Integer i = 1;
Integer j = i;
i = i + 1;

したがって、はi別のIntegerに等しい を指しており、元のに等しい をまだ指しています。2jInteger1

同じことがあなたのString例にも当てはまります。

オブジェクトの場合、オブジェクトの内部状態を変更するポインターを変更しません。したがって、 と の両方が同じperson1person2指しPersonます。

あなたがした場合

Person person1 = new Person("Alice");
Person person2 = person1;
person1 = new Person("Bob");

それから、person1が今は違う Personことは明らかなはずです。

于 2013-04-28T10:11:06.787 に答える
0

1) 文字列とラッパー (Integer、Long ..) は不変オブジェクトであり、2) Person は可変オブジェクトであり、そのプロパティを変更しました。person1 と person2 は同じ参照を指しているため、変更は両方のオブジェクトに適用されます。

(不変 - 一度作成すると、その状態を変更することはできません)

于 2013-04-28T10:16:04.777 に答える