41444
プログラミング初心者です。

```

    String name1 =“Japan”;
    String name2 =“USA”;
    String name3;
    name3 = name1;
    name1 = name2;
    name2 = “UK”;
    system.out.println(name1);
    system.out.println(name2);
    system.out.println(name3);
    
```

上記コードのアウトプットは

```

    UK (name1 = name2 = UK と考えました)
    UK
    UK (name3 = name1 = name2 = UK と考えました)
    
```

と表示されると思っていましたが、  
実際は、以下の通り表示されます。

```

    USA
    UK
    Japan
    
```

なぜこのように表示されるかご教示頂けますと幸いです。  
どうぞよろしくお願いいたします。
CC BY-SA 3.0
2018-02-03T20:14:27.527
41441
2018-02-04T10:09:08.137
2018-02-03T21:00:58.673
2808
26303
question
java
JavaのStringについて
プログラミング言語の代入と、等値性の宣言を混同されているのでしょうか。

```

    String name1 =“Japan”;
    String name2 =“USA”;
    String name3;
    name3 = name1; //`name3`にはこの時点の`name1`の値である"Japan"が代入される
    name1 = name2; //`name1`にはこの時点の`name2`の値である"USA"が代入される、`name3`には無関係
    name2 = “UK”;  //`name2`にはこの時点で"UK"が代入される、`name1`や`name3`には無関係
    
```

1行目の代入で設定された`name3`の値が2行目の`name1 = name2;`で変わることはありません。数学記号の`=`を使っていますが、`name3
=
name1;`という代入は、「この後ずっと`name3`と`name1`を同じ値にする」という意味ではなく、単に「その時点の`name1`の値を`name3`に代入するだけ」(以下同様)と言うのがわかればすぐにご理解いただけると思うのですが、いかがでしょうか?
CC BY-SA 3.0
2018-02-04T01:29:20.473
41444
2018-02-04T01:29:20.473
13972
41441
answer
上記の説明、ちょっと違う気がするのですが、、、

例えば、

> name3 = name1;  
>  これは、この時の name1 の値 "japan"が name3に代入されるのではなく、name3が指し示すオブジェクトが "japan"
> という(name1が指し示していた)オブジェクトになる事では?  
>  同様に、  
>  name1 = name2;  
>  name1が指し示すオブジェクトが (この時、name2が指し示す) "USA"になり、  
>  name2 = "UK";  
>  name2 が指し示すのが、(新しく作られた) "UK" というオブジェクトになる。

文字で書くとちょっと分かりにくいかも知れません。

で注意が必要なのが、文字列の比較。 同じ文字列(を指し示す 変数)でも == の比較で一致と判定され無い事があります。  
name1 = "USA";  
name2 = "USA";  
(name1 == name2) ==> これは一致すると思われる。(同じオブジェクトを指している可能性大)  
name3 = "US";  
name2 = name3 + "A";  
(name1 == name2) ==> 一致しないと判定される。(筈。--> 違うと指摘あり、仕様確認が必要)

理由は、== が中の文字列で判定していないためで、他のオブジェクトでも同様。  
string.equals メソッド等で判定する必要があります。

以上、参考までに。
CC BY-SA 3.0
2018-02-04T09:45:00.233
41452
2018-02-04T10:09:08.137
2018-02-04T10:09:08.137
41441
answer