━目次━
連載2日目です。1日目がまだの人は1日目から読むことをオススメします。
全体はこんな感じ。
【1日目】値(プリミティブ)型と参照(オブジェクト)型の違いをコードと図で解説
【2日目】参照渡しとは?参照型の変数を代入した時の挙動を押さえよう!
【3日目】==とequalsの違いは図で理解すれば絶対間違えない
【4日目】イミュータブルな変数ってなんだ?String型変数の特殊性を知る
参照周りで押さえておきたい内容について4回に渡って解説していきます。
今日は参照渡しについて。
本ブログの熱烈なねつれーつな読者の方(そんな人いるのか)は、以前参照渡しについての記事を書いたのを知っているかもしれません。
それがこちら
これは関数に参照型を渡すときの話ですが、今回はもっと手前の代入あたりにフォーカスをしぼっていきます。
この記事を読んだ後に↑の記事も読んで頂くとより理解が深まるかと思います。
それでは2日目いきましょう~(/・ω・)/
変数の代入
変数の代入とは「ある変数が持っている値を別の変数に渡すこと」です。
「渡す」と言っていますが、自分自身の値が消えるわけではないので、コピーするイメージです。
コードで見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* 値型の場合 */ // num1の値は1 int num1 = 1; // num2という変数にnum1の値を代入 int num2 = num1; // num2の値を出力 System.out.println(num2); // 1 /* 参照型の場合 */ // arr1の中身は1,2,3 int[] arr1 = {1,2,3}; // arr2という変数にarr1の値を代入 int[] arr2 = arr1; // arr2の値を出力 System.out.println(arr2[0]); // 1 System.out.println(arr2[1]); // 2 System.out.println(arr2[2]); // 3 |
まぁ当たり前じゃな!
ここまでは簡単だね。じゃあ次は代入したあとの変数(num2、arr2)を変更したときの動きを見てみよう。
代入した後に変数を書き換えたときの挙動を確認する
値型の場合
先程のコードで、代入した後のnum2の値を書き換えたらどうなるでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 |
// num1の値は1 int num1 = 1; // num2という変数にnum1の値を代入 int num2 = num1; // num2の値を2にする num2 = 2; // num1の値を出力 System.out.println(num1); // 1 // num2の値を出力 System.out.println(num2); // 2 |
まぁこれは普通に理解できるかと思います。
これが参照型の場合はどうなるでしょうか。
参照型の場合
代入した後のarr2という配列の最初の要素を9に書き換えてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// arr1の中身は1,2,3 int[] arr1 = {1,2,3}; // arr2という変数にarr1の値を代入 int[] arr2 = arr1; // arr2の最初の要素を9にする arr2[0] = 9; // arr1の値を出力 System.out.println(arr1[0]); // 9 System.out.println(arr1[1]); // 2 System.out.println(arr1[2]); // 3 // arr2の値を出力 System.out.println(arr2[0]); // 9 System.out.println(arr2[1]); // 2 System.out.println(arr2[2]); // 3 |
arr1のほうは何もしてないのにarr1の最初の要素まで9に変わってしまいましたね。
なぜこんなことが起きるのでしょうか?図で確認していきましょう。
参照型の代入では何が起きているか
ここで1日目に使った図がいきてきます。
まずarr1を宣言しますが、1日目の講義で言ったように
arr1という変数に入っているのはあくまで参照値
でしたね。
なので
「arr2にarr1を代入する」
というのは
「arr2にarr1の参照値を代入する」
ということです。
図で見ると以下のような状態です。
2つの変数が同じ参照値を持っている状態です。
あとはもう分かりましたね?
arr2[0] = 9;のように値を変えた場合、ヒープ領域の同じ場所を見ているので、arr1の値も変わってしまうということです。
1日目の話で言うと、ロッカーの鍵の合鍵を作る感じか!
そう!あくまでロッカーは1つのままだね。
2日目はここまで
参照型の代入の動きが分かったところで2日目はここまでとしておきましょう。
冒頭にも触れましたが↓の記事ではファンクションも絡めて話していますので、復習がてら読んでみてください^^
Javaの参照渡しと値渡しについてこの世で1番分かり易く解説してみた
さぁでは4日間の集中講義も折り返しがきました。
明日は「==」「equals」の違いとその内部をこれまでの図と絡めてみていきます。
それでは!また明日!!
人気の記事だけ集めたので是非覗いていってください^^
厳選!目的別にオススメ記事を紹介-あなたの欲しい情報がここに-