【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】意外と知らない基礎知識の最新記事】

【JAVA】JAVAは"ほげほげ"??

ある現場に行ったときのことです。

Aさん:『あのぉ。てるさん。』
てる。:『はい。なんですか?』

Aさん:『JAVAを開発する人って何で”ほげほげ”って書くんですか?』
てる。:『exclamation&question

Aさん:『いやぁ。JAVAの勉強をしてるんですけど。。。
     サンプルソースの変数にhogehogeってよくあるので』

ふたり:『わはっは』


Aさんは面白い人でまだ現場になれていない私を
リラックスさせようとしてくれたのだと思います。


ちなみにその後2人で『ほげほげ』について真剣に調べ理由がわかりました。


キーボードの英字部分を縦横中心を探してみてください。
で、HとGの位置、OとEの位置

ちょうど対称(反対)になってませんか?

だから、早く打ちやすいとの理由からよく使う人が多いらしいです。



みなさんは『ほげほげ』してますか?





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



posted by てる。 at 00:16 | Comment(2) | TrackBack(0) | 【JAVA】雑記 | このブログの読者になる | 更新情報をチェックする

【JAVA】『無いと思います』

これはなしだろ・・・がく〜(落胆した顔)


バグつぶしが仕事となった今日この頃。
ネットを散策中こんな記事をがく〜(落胆した顔)

http://itpro.nikkeibp.co.jp/article/COLUMN/20081125/319810/

ありえないです爆弾

確かに私のブログでも下記のサイトを紹介しました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43465&forum=12&162

とはいえ、日経の記事と@ITの投稿は意味がぜんぜん違う。

@ITはいろんな状況、パターン、いろんな考えで熱く討論しています。
その中で参考になる投稿があり、
そしてそこから自分の考えを導き出してもらえればと思い
紹介をしました。

『stringVariableはNULLではない』という前提があるのかもしれません。
でも日経の『これがBESTexclamation×2』という書き方はない。

仮に、上の記事を参考にした初心者がまねをして
NullPointerExceptionを発生させるバグを埋め込んだらどうするのだろうか。


ちなみに、自分の場合は以下のようにしてます。
ただし、

 ・stringVariable はString型の変数
 ・stringVariable はnullのことがある。
という条件があった場合です。


■自分だけ(練習、ためしのコーディング)



ためしなので例外が出てもよいので。
if ("".equals(stringVariable)) {
    なんかの処理
}

■普通の現場なら



ストレートに
if (stringVariable != null && stringVariable.equals("")) {
    なんかの処理
 }


■ハイレベルな現場なら



たぶん下記のソースの意味をすぐに理解できると思うので速度の速い。
if (stringVariable != null && stringVariable.length == 0) {
    なんかの処理
}

とする。

■その他


空文字判定にString.isEmpty()というのもあるらしいが
1.6 から導入されたメソッドらしくまだまだ認知度も低いので
現段階では使わない。

もちろん、上の例に限っているわけではなくその状況によっていろいろ変えます。


タグ:java 初心者


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



posted by てる。 at 23:47 | Comment(0) | TrackBack(0) | 【JAVA】雑記 | このブログの読者になる | 更新情報をチェックする
×

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