デザイナーが始めるプログラミング

グラフィックデザインを経験後、プログラマーへと転身すべく日々の勉強を書き綴った奮闘日記

参照渡しの勘違い(java)

ただいまJavaについて勉強中ですが下記の実行結果の理由がどうしても

分からず立ち止まってしまっていました。

結果的に僕が参照渡しの考え方を間違えていたんですね。。分かりづらいぜ。。

 

public class Test {

  public static void main(String args) {

   Test ojb1 = new Test();

   Test ojb2 = new Test();

   System.out.print(ojb1 == ojb2)

   ojb2 = operate(ojb1, ojb2);

   System.out.println(" " + (ojb1 == ojb2));

  }

static Test operate(Test ojb1, Test ojb2) {

   Test ojb3 = ojb1;

   ojb1 = ojb2;

   return ojb3;

   }

}

正結果:false true

誤結果:false false

 

ずっと誤結果になるはずと思い込んで1時間は立ち止まってしまいました。。

「operate」クラスに参照渡しをすると「main」クラスに戻っても反映された

ままになる。

訳ではなく、あくまでも「operate」クラスで

新たなメモリ領域に作った変数「ojb1」,「ojb2」にアドレスを格納してるだけ

なんですね。汗

なのでreturnしたデータ以外はmainクラスではなにも影響はないんですね。

 

こちらのサイトに非常に分かりやすい説明がありますのでリンクさせていただきます。

http://www.tec-q.com/note/2007/04/_java_13.html

のちに気づいたのですが、こちらの方の説明はString型での説明でしたので

正しい結果ですが僕の気になっている部分と少し違っておりました。

もしも基本型配列などの参照型(int、double[]、etc...)の場合、呼び出し先のメソッド内で値を変更するとmainに戻ってきたら値は反映されます。

(※String型は値変更が不可能で別アドレス上に変数を作成しますが基本型配列は

同アドレス上で変更できるため)

 

進めるほどこんがらがります。汗