インスタンスの共有 - 萌えJava超入門
第十一章
メモリで見る基本型とクラス型の違い

インスタンスの共有

クラス型変数にクラス型変数を代入すると、
メモリの中では何が起こっているのか見てみましょう。

目次


1.サンプルプログラム

引き続きクラス型変数の動作を確認していきましょう。
クラス型変数にクラス型変数を代入したらどうなるのでしょうか。
前のページの Sample06_02.java を少し修正した以下のコードで見ていきましょう。

変数 array_2 に array_1 を代入しています。


//Sample06_03.java
class Sample06_03 {
  public static void main(String[] args){

    int[] array_1;//変数の宣言
    array_1 = new int[4];//初期化

    array_1[0] = 1230;
    array_1[1] = 1231;
    array_1[2] = 1232;
    array_1[3] = 1233;

    /*array_1の値確認*/
    System.out.println("array_1");
    for(int i=0; i<array_1.length; i++){
        System.out.println(i + " = " + array_1[i]);
    }

    System.out.println("--------------------");
    int[] array_2;//変数の宣言
    array_2 = array_1;//代入
    System.out.println("array_2 = array_1;");
    System.out.println("--------------------");

    /*array_2の値確認*/
    System.out.println("array_2");
    for(int i=0; i<array_2.length; i++){
        System.out.println(i + " = " + array_2[i]);
    }

    System.out.println("--------------------");
    array_2[1] = 9991;//array_2の値変更
    System.out.println("array_2[2] = 9992;");
    System.out.println("--------------------");

    /*array_1の値確認*/
    System.out.println("array_1");
    for(int i=0; i<array_1.length; i++){
        System.out.println(i + " = " + array_1[i]);
    }
  }
}

コマンドライン
>javac Sample06_03.java
>java Sample06_03
array_1
0 = 1230
1 = 1231
2 = 1232
3 = 1233
--------------------
array_2 = array_1;
--------------------
array_2
0 = 1230
1 = 1231
2 = 1232
3 = 1233
--------------------
array_2[2] = 9992;
--------------------
array_1
0 = 1230
1 = 1231
2 = 9992 ←ココ!!
3 = 1233

注目してほしいのは
array_2[2] = 9992; で
array_2の値を変更したのに、
array_1の値も変更されている点だ。


2.クラス型変数 array_2 の宣言

前のページと重複するので、int[] array_2;//変数の宣言
から説明していきますね。

array_1の初期化&代入したところ

array_2 を宣言
int[] array_2;
変数 array_2 と メモリのメモリアドレス 0x0098が紐づけられました。



3.array_2 に array_1 を代入


array_2 に array_1 を代入
array_2 = array_1;

代入に関しては、
変数が基本型でもクラス型でも変わらない。
単純にメモリ内の値を代入先にコピーする。
コピーされるのがアドレスの場合は注意が必要だ。
クラス型では
アドレスが代入されるだけなのね。

代入
代入は単純にメモリ内の値を代入先にコピーします。
基本型でもクラス型でも変わりません。

new 演算子が使われていないことに注目してください。
新しいインスタンスを生成しているわけではないのです。



4.array_2 から要素を上書きする

array_2 の要素を上書きする
array_2[2] = 9992;

array_2に保存されたメモリアドレス(0x0050)を参照します。
参照先 0x0050 の要素[2] に 9992を代入しました。



5.array_1 から要素を確認する

array_1 の要素を確認
array_1[i];

代入されるのがアドレスの場合は
同じインスタンスを
参照しちゃうってことっスね!
それだ!!
基本型ではメモリの中が値だったために
値が直接代入された。
これが大きな違いだ。
クラス型は変数を2つ用意して代入しても、
コピーにならないのね。


クラス型変数の代入
代入元の値がメモリアドレスの場合、インスタンスが共有されます。



お疲れ様でした。




© 2019 awasekagami