変数のコピー元を変更するとコピー先が変わる場合と変わらない場合

Javaにおいて変数のコピー先が変わらない例

String a = "りんご";  // (1)
String b = a; // 変数bにaを代入 (2)
System.out.println(a);
System.out.println(b);

実行結果
りんご
りんご
// 変数aに値を設定し直す
a = "みかん";  // (3)
System.out.println(a);
System.out.println(b);

実行結果
みかん
りんご

変数aは「みかん」に置き換わるが、変数bは変わらない。これは下記のようなイメージ。

 (1) String a = “りんご”のイメージ
  「りんご」の写真を撮り、その写真をaという箱に入れる。

 (2) String a = bのイメージ
  aの箱に入っている「りんご」の写真のコピーを取り、そのコピーをbの箱に入れる。

 (3) a = “みかん”のイメージ
  aの箱に入っていた「りんご」の写真を捨てて、aの箱に「みかん」の写真を入れる。

コピーを取ってbの箱に入れた「りんご」の写真はそのままなので、System.out.println(b)は「りんご」となる。

コピー先が変わる例

// 配列を作成する
String[] c = new String[] { "りんご", "バナナ" };  // (1)
String[] d = c;  // (2)

System.out.println(d[0]);
System.out.println(d[1]);

c[0] = "みかん";  // (3)

System.out.println(d[0]);
System.out.println(d[1]);

実行結果
りんご
バナナ
みかん
バナナ

配列の要素c[0]を変更すると、d[0]の内容も変わる。これは下記のようなイメージ。

 (1) String[] c = new String[] { “りんご”, “バナナ” }のイメージ
  「りんご」の写真を撮って、cという棚の[0]という箱に入れる。
  「バナナ」の写真を撮って、cという棚の[1]という箱に入れる。

 (2) String[] d = cのイメージ
  cの棚の箱を全て取り出して、中身をコピーするのは大変なので(今回は2個だけだが、通常はもっと多いことを想定している)、
  dという棚の[0]の位置にcという棚の[0]を見るようにとメモを置く。
  dという棚の[1]の位置にcという棚の[1]を見るようにとメモを置く。

 (3) c[0] = “みかん”のイメージ
  「みかん」の写真を撮って、cという棚の[0]という箱に入れる。

変数dには値のコピーはなく、参照先の情報しかないため、System.out.println(d[0])とするとc[0]の情報を参照することになり、コピー元と同様に表示される値が変わることになる。

同様に変数cとdを逆にしても、表示される値が変わる。

String[] c = new String[] { "りんご", "バナナ" };
String[] d = c;

System.out.println(c[0]);
System.out.println(c[1]);

d[0] = "みかん"; // コピー先を書き換える (4)

System.out.println(c[0]);
System.out.println(c[1]);

実行結果
りんご
バナナ
みかん
バナナ

 (4) d[0] = “みかん”のイメージ
  「みかん」の写真を撮って、dという棚の[0]という箱に入れようとしたら、そこに箱はなく、cという棚の[0]を見るようにとメモがあったので、cという棚の[0]の箱の中に「みかん」の写真を入れる。

(4)の操作でc[0]の内容が変わってしまっているので、System.out.println(c[0])の出力も「みかん」になる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です