Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

プレゼン、ボランティアコーチします!

勉強会で話したいけど、プレゼンが初めて、苦手という方に無償でコーチします!

  • スライドのレビュー
  • 録画リハへのアドバイス

Twitter@jyukutyoまでメンションでもDMでも。 デブサミやJJUG CCCなど200人規模で登壇しました。海外での登壇も短いながらあり。デブサミ2017では公募スピーカー1位でした!

Javaは参照渡しじゃないって頭ではわかってるけど

特に説明するような内容ではないんだけど。
Javaではメソッドの引数は参照渡しじゃなくすべて値渡し。

   
    void fuga(int a) {
        a = 1;
    }

    void hoge() {
        int b = 0;
        fuga(b);
        System.out.println(b);
    }
    // hogeを呼び出してもbは0のまま  

つまり引数には値のコピーを渡す。
プログラムを始めた人はよく間違ってしまうよね。

でもプリミティブじゃなくて参照型でこういうサンプルを作ると、
よく参照渡しと勘違いされてしまう。
参考書とかでもJavaは参照渡しと間違っているのもあるらしい。

class Human {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

    void fuga(Human h) {
        h.setName("jyukutyo");
    }

    void hoge() {
        Human h = new Human();
        huga(h);
        System.out.println(h.name);
    }
    // hogeを呼び出すとnameは"jykutyo"になる

nameが変わったから参照渡し、ではなくて、あくまで参照を値で渡してる。
って頭ではわかってるんだけど、参照を値で渡すってどういうことかいまいちピンとこないなあ。

アドレスを直接渡してるのではなくて、アドレスへの参照を元の参照からコピーして作成して、
それを渡してるってことが参照を値で渡すってこと??