F吉の蓄積

記憶力の良くない学生の知識の保管。初歩的なITとか株とか

【Java】クラス生成時の変数はオブジェクトを指すアドレス

ClassX obj1 = new ClassX();

ClassX obj2 = new ClassX();

このようにクラスのオブジェクトを生成すると、ClassXオブジェクトの領域が確保され、obj1,2にはそれぞれの領域を指す参照値(アドレス)が入る

f:id:fkichi:20170305143708p:plain

変数obj1にobj2を代入してみる。

obj1 = obj2;

 これを行うとobj1はobj2と同じ領域を参照するようになる。

f:id:fkichi:20170305145901p:plain

(誰にも参照されなくなった一つ目のClassX領域はガベージコレクション機能で自動的に解放される)

 

例えばメソッドの引数としてクラスのオブジェクトを渡すことを考えてみる。

public static void main(String[] args){

          ClassX obj1 = new ClassX();

          methodX(obj1);

}

void methodX(ClassX obj){

          ClassX obj2 = new ClassX();

          obj2 = obj1;

          //処理

}

methodXで作成したobj2はobj1と同じ領域を参照するようになったので、このメソッド内でobj2のメンバを書き換えたりするとobj1のメンバも同じように書き換わる(ように見える)。

配列の参照渡しと同じ考え方ですね。ちなみにJavaでは配列とクラスオブジェクトだけが参照渡しらしい(String除く)。

 

Javaで「参照渡し」という呼び方は適切じゃないみたいです。まあそのへんの詳しいところはちょっと後回しにします…。

qiita.com