第十一章
メモリで見る基本型とクラス型の違い
基本型(プリミティブ型)変数とメモリ
基本型(プリミティブ型)変数とメモリの関係をみてみましょう。
目次
1. サンプルプログラム
以下のコードを例にして、メモリのなかで何が起こっているのか見てみましょう。
//Sample06_01.java
class Sample06_01 {
public static void main(String[] args){
int num_01;
num_01 = 4126; //代入
System.out.println("num_01 = "+num_01);
System.out.println("----------");
int num_02;
num_02 = num_01; //代入
System.out.println("num_01 = "+num_01);
System.out.println("num_02 = "+num_02);
}
}
コマンドライン
>javac Sample06_01.java
>java Sample06_01
num_01 = 4126
----------
num_01 = 4126
num_02 = 4126
num_01 と num_02
2つの変数が使われているな。
2. 基本型(プリミティブ型)変数の宣言
基本型(プリミティブ型)は、データ型ごとにメモリサイズが決まっています。
この為、変数を宣言した時点で必要分のメモリを確保しています。
変数num_01とメモリアドレスの紐づけ
int num_01;
変数 num_01 が宣言されると、任意の場所のメモリが確保されます。
確保されるメモリのサイズは、intなので 4byteです。
図では、変数 num_01 がメモリアドレス「0x0038」に紐づいた例を示しています。
今後、変数num_01は、
メモリアドレス 0x0038 として処理される。
この時 0x0038 の中は空っぽ?
鋭いなぁ。
メソッドの中で宣言した変数は空っぽだ。(注1)
参照するとエラーになる。
classの直下に宣言した変数は「規定値」が入る。
この場合は、
mainメソッドの中だから空っぽか~。
てゆうか、
classの直下に変数が宣言できるのね?
その通り。
この解説も、もう少しあとで。
変数のスコープ(有効範囲)と
併せて説明したい。
3. 変数に値を代入する
変数への代入
num_01 = 4126;
変数 num_01 に紐づいたメモリアドレス 0x0038 に値が代入されました。
変数の宣言時にメモリが確保されて、
確保されたメモリに
直接値を書き込んでいるのが特徴だ。
なるほど。
まあ想像通りよね。
4. 変数に別の変数の値を代入する
変数num_02とメモリアドレスの紐づけ
int num_02;
変数 num_02 が宣言されると、これも任意の場所のメモリが確保されます。
図では、変数 num_02 がメモリアドレス「0x0064」に紐づいた例を示しています。
今後、変数num_02は、
メモリアドレス 0x0064 として処理される。
num_02 = num_01 が実行されるとこんな感じになります。
num_02 = num_01;
変数 num_01 に紐づいたメモリアドレス 0x0038 の値が、
変数 num_02 に紐づいたメモリアドレス 0x0064 に代入されました。
割と普通だろ?
わざわざ一章割いて説明する内容なのか
疑問なほどよ?
OK!
ほんじゃ楽しい方行ってみよう。
クラス型変数ではどうでしょうか。