2

昨日、私は値による参照、ある配列から別の配列への奇妙な сopy 値について質問し、このコードを見た後に答えを理解したと思いました:

public static void main(String[] args) {
  String[] x = {"A"};
  String[] y = x;
  x[0] = "B";
  System.out.print(x[0] + " " + y[0]);
}

次に、最初の例と同じ次の例を見ました。

public static void main(String[] args) {
  String x = "A";
  String y = x;
  x = "B";
  System.out.print(x + " " + y);
}

そして、この例では、正解がB Aではなく になる理由がわかりませんB Bxを宣言してからy参照すると思いますx

4

6 に答える 6

1

最初の例では、行

String[] y = x; 

x を y に設定します。 ただし、 x はメモリ アドレスを参照します。

だからあなたが電話するとき

x[0] = "B";

そのアドレスの値を変更しています。これはxとの両方がy参照しています。


2 番目の例では、xandyは参照型ではありません。

だからあなたが電話するとき

String y = x;

最初の例と同じようにat の値を取り、xそれを にコピーしますが、とはaddressではなくであるため、それらは別のものです。yxy

だからあなたが電話するとき

x = "B"

の値にはまったく影響しませんyy遺跡"A"

*技術的Stringには s も参照ですが、それらは不変であるため、 や のような値型と同様に動作しintますfloat

于 2013-10-30T19:01:20.853 に答える
1

String[] x = {"A"};

参照を作成しx、それを新しく作成した配列に割り当てています

x  ---> ["A"]

次の

String[] y = x;

参照を作成し、値をy割り当てているため、保持する同じ配列への参照になりますxx

x  \
    }--->["A"]
y  /

のようなものではありません

y -> x ---> ["A"]

これで、 2 つの参照を介して同じ配列にアクセスできるようになりました。を介して変更すると、同じ配列であるため、xこの変更を介して確認できることを意味します。y

x[0] = "B";

しましょう

x  \
    }--->["B"]
y  /

これが の結果System.out.print(x[0] + " " + y[0]);B B


2番目の例では

String x = "A";

参照を作成しx、それに文字列を割り当てます"A"

String y = x;

別の参照yを作成し、同じ値を割り当てるxので、再び同じオブジェクトを使用します

x  \
    }---> "A"
y  /

しかし

x = "B";

最初の例のように同じオブジェクトを変更していませんが、参照を変更xして異なる文字列を保持する"B"ため、状況は次のようになります

x  ---> "B"

y  ---> "A"

そのため、 がSystem.out.print(x + " " + y);印刷されB Aます。

于 2013-10-30T19:17:55.227 に答える