【JAVA】参照渡しと値渡し Part1

参照渡しとか、値渡しとか、いかにも”コンピュータ”という感じの
用語には鳥肌が立つほど苦手なてるですが、
この小難しい用語について一度整理をしてしっかりと脳みそに叩き込んでしまいたいと思います。

みなさんもしっかりとついてきてくださいね。

まずしっかりと覚えなければいけないのは
『参照渡し』『値渡し』という用語。

まず『参照渡し』。
これは、私が見ている場所にはこれがありますよ。ということ。
たとえば、机の上にリンゴがあります。
ここで他の人が机の上のリンゴをミカンに取り替えた場合。

『あなたが見ているのは何ですか?』という質問があったとき
見ているのは机の上なので、ミカンに変わってしまいます。


で、反対に値渡し。
これは、私が見ているものはこれですよ。ということ。
先ほどの例にたとえると、机の上にリンゴがあります。
でも、見ているのはリンゴ。
ここで他の人が机の上のリンゴをミカンに取り替えた場合。

『あなたが見ているのは何ですか?』という質問があったとき
ずっとリンゴを見ているので答えは『リンゴ』ですね。


つまり、同じ質問が来ても、何(どこ)を見ているのかで答えが変わります。

実際には"渡し"という言葉のとおり他の人がいきなり取り替えるではなく、
他の人にリンゴの管理を任せた(渡した)後、"机"に注目するのか、"リンゴ"に注目するのかということです。
ただ、おそらくこの例えのほうがわかりやすいかと思います。



で、Java の場合、どうなるかといえば。


一般的に引数であれば、プリミティブ型(booleanとかintとか)であれば値渡し、
オブジェクト(BeanやMap)であれば参照渡しといわれています。

でも、これが誤解を生む原因となっています。

なので、余計にわかりづらい。
ここでしっかりと整理し、すっきりしちゃいましょう。


さて、下記のようなソースがあった場合、コンソールに出力される値は何でしょうか?


public class Sample {

    public static void main(String[] args){
        int value = 0;
        test1(value);
        System.out.println(value);
    }

    public static void test1(int id) {
        id = 1;
    }
}



実際に試していただきたいのですが答えは、『0』です。
『プリミティブ型(booleanとかintとか)であれば値渡し』のとおり、
私が見ているのは0だ!他人が机の上を変えようが0だ! ということです。

では、下のソースでは??


public class Sample {

    public static void main(String[] args){
        String value = "テスト";
        test1(value);
        System.out.println(value);
    }

    public static void test1(String id) {
        id = "ほげほげ";
    }
}



答えは、次回に。
スッキリしてもらうために少しの間モヤモヤしていてください。
(気になる方は自身で試してみてくださいね。)



参考になりましたらクリックしていただけると励みになります。



【【JAVA】意外と知らない基礎知識の最新記事】
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。