String a = "test";
String b = a;
a = "wuut";
System.out.println(b);
プリントアウトtest
その価値をとるだけでなく、b
の参照を保持するべきではありませんか?a
Javaはオブジェクトなどでそのように機能しませんか?
bは、その価値をとるだけでなく、aの参照を保持するべきではありませんか?
いいえ。の値a
は参照です。参照は、変数ではなく、オブジェクトにアクセスする方法です。代入演算子は、右側の式の値を左側の変数にコピーするだけです。それがすべてです-それは非常に簡単です。Javaには参照渡し、変数エイリアシングなどはありません。
が作成されたとき、それがメモリ内a
に配置することを指しているとしましょう。memory_1
b
に割り当てられている場合a
、は同じ場所b
を指します。memory_1
これで、a
値を変更すると(そして、文字列オブジェクトが不変であるため)、新しい値がメモリに作成され、をa
指すようになりmemory_2
ます。
しかしねえ、b
まだポイントしmemory_1
ます。
PS:不変性は次のとおりです。
オブジェクト指向および関数型プログラミングでは、不変オブジェクトは、作成後に状態を変更できないオブジェクトです。
String a = test
ヒープa
上の文字列リテラルの「テスト」Object Reference Variable
を指しています。
String b = a;
いいえb
、ヒープ上の同じ文字列リテラルの「テスト」Object Reference Variable
も指していません。
今、
a = "wuut";
しかしb
、それでも文字列リテラルの「テスト」を指しています。
したがって、そのbは、以前はaによっても参照されていたオブジェクトへの参照を保持しますが、aへの参照は保持しません。
いいえ、そうではありません。の値をb
想定しています。後で変更する場合は、変更しません。それはエイリアスでもその性質のものでもありません。a
a
b
String a = "test";
これで、aは文字列「test」への参照を保持します。
String b = a;
aの値がbにコピーされます。Aは「テスト」への参照であるため、bも「テスト」への参照になります。
a = "wuut";
これで、aに「wuut」への参照が割り当てられます。bはaへの参照を保持していないため、これはbには影響しません。
No.は、文字列への参照であるb
値を保持します。あなたが考えているのは、それを指す文字列を変更した場合も変更されるということです(のようなもの)。ただし、Java文字列は不変であるため、変更することはできません。a
"test"
b
a.append("wuut");
このステップを段階的に見ていきましょう。
String a = "test"
-このオブジェクト上にオブジェクト"test"
と参照a
点を作成します。String b = a
-同じオブジェクトへの新しい参照b
ポイントを作成します"test"
a = "wuut"
-参照a
を別のオブジェクトに再割り当てしますが、参照b
は引き続きオブジェクトを指しますtest