第十一章
メモリで見る基本型とクラス型の違い
インスタンスの上書き
クラス型変数にインスタンスを上書きすると、
メモリの中では何が起こっているのか見てみましょう。
目次
1.サンプルプログラム
さらに、クラス型変数の動作を確認していきましょう。
すでにインスタンスを代入した変数に、インスタンスを代入したらどうなるのでしょうか。
以下のコードで確認してみましょう。
//Sample06_04.java
class Sample06_04 {
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("------------");
array_1 = new int[6];//もう一回初期化
/*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_04.java
>java Sample06_04
array_1
0 = 1230
1 = 1231
2 = 1232
3 = 1233
------------
array_1
0 = 0
1 = 0
2 = 0
3 = 0
4 = 0
5 = 0
注目してほしいのは
array_1 = new int[6]; で
array_1が初期化されてしまったところだ。
メモリの中ではどうなっているだろうか。
2. もう一回初期化
array_1 = new int[6];//もう一回初期化
から説明していきますね。
array_1の最初の初期化&代入をしたところ
2回目の初期化
array_1 = new int[6];
new 演算子によって、別の場所に配列インスタンスが生成されました。
配列インスタンスのメモリアドレス 0x00A0が紐づけられました。
0x0050のインスタンスとは別の場所に新しいインスタンスを生成しているところに注目です。
あれ?
0x0050 のインスタンスは
どうしちゃうんです?
廃棄だ。
容赦ないわね!!
3.ガベージコレクション
ガベージコレクションとは、メモリの自動解放メカニズムのことです。
参照元がなくなったメモリは、ガベージコレクションの対象となり、
解放(メモリが他の作業に使えるようになる事)されます。
Javaでは、特にソースコードに記述しなくても、自動的にこのような処理が行われます。
Javaはメモリの管理をプログラムに委ねている言語なのです。
0x0050 が ガベージコレクションになる図
4. null の使い方
クラス型変数の中に代入されているメモリアドレスを、明示的に削除することもできます。
大きなデータを扱っていて、メモリを空けたいときには「null」を使いましょう。
null で解放
これで array_1 は初期化前の状態になる。
null はクラス型変数にしか使えない。
「参照しないで!」という意味だからな。
お疲れ様でした。