変数に格納されている「インスタンスへの参照リンク」

Java Silver

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」を出力

  }

}

参照型の変数には「インスタンスのアドレス値(参照リンク)」が格納されているということが、ポイントとなります。

コメント

タイトルとURLをコピーしました