Javaには、プリミティブ型と参照型といったデータ型がありますが、
今回は、参照型の変数について解説します。
まずは、例題となるソースコードをご確認ください。
例題
public class Hoge{ public int num ; public void printNum(){ System.out.println(num); } }
public class Fuga{ public static void main(String[] args){ Hoge h1 = new Hoge(); Hoge h2 = new Hoge(); h1.num = 100; h2.num = 200; h1 = h2; h1.printNum(); } }
このコードを実行すると、
「100」あるいは「200」、どちらが出力されるでしょうか。
答えは「200」となります。
参照型の変数がもっている値
今回の例では、
h1変数、h2変数ともに、Hogeクラスというオブジェクトを扱っているので、「参照型」の変数であることがわかります。
実際、参照型の変数に代入されているのは、「インスタンスのアドレス値」です。
インスタンスのアドレス値の確認方法
インスタンスのアドレス値(参照リンク)の例:「jp.co.xxx.Hoge@1d251891」
Hoge h1 = new Hoge(); System.out.println(h1);
実行結果
jp.co.xxx.Hoge@1d251891
今回の場合、以下の処理が実行されると、
Hoge h1 = new Hoge(); Hoge h2 = new Hoge();
Hogeクラスがロードされ、メモリ上にHogeインスタンスが生成されます。
インスタンスのアドレス値(参照リンク)とは、メモリ上の住所のようなものであり、
h1変数には参照リンク「例: jp.co.xxx.Hoge@1d251891」が代入され、
h2変数には参照リンク「例: jp.co.xxx.Hoge@1d251892」が代入されることになります。
例題では、以下のコードが実行されているので、
h1 = h2;
h1変数がもつ参照リンクは、h2変数がもつ参照リンクと入れ替わり、
もともとh2変数が扱っていたオブジェクトを扱うことになります。
public class Fuga{ public static void main(String[] args){ Hoge h1 = new Hoge(); ⇒h1がもつ参照:jp.co.xxx.Hoge@1d251891 Hoge h2 = new Hoge(); ⇒h2がもつ参照:jp.co.xxx.Hoge@1d251892 h1.num = 100; h2.num = 200; h1 = h2; ⇒h1がもつ参照:jp.co.xxx.Hoge@1d251892 h1.printNum(); ⇒「200」を出力 } }
参照型の変数には「インスタンスのアドレス値(参照リンク)」が格納されているということが、ポイントとなります。
コメント