メモ
プリミティブ型(基本データ型)と参照型
Javaの型は大きく分けて2種類あります。プリミティブ型と参照型です。
それぞれについてまとめてみました。
プリミティブ型とは
以下の8つがプリミティブ型です。
型 | 分類 | bit数 |
---|---|---|
boolean | 真偽値 | 1 |
byte | 整数 | 8 |
short | 整数 | 16 |
char | 文字 | 16 |
int | 整数 | 32 |
float | 小数 | 32 |
long | 整数 | 64 |
double | 小数 | 64 |
プリミティブ型の変数宣言時は、宣言と同時に変数に値を格納できます。
以下の変数aには、そのまま1という値が格納されます。
int a = 1;
参照型とは
参照型は、上の8つ以外の型です。
例えば、Stringや配列などが参照型です。
Hoge hoge = new Hoge();
String str = "fuga";
参照型では変数に値はそのまま格納されず、値が格納されたメモリの場所を格納します。
再代入で見る基本型と参照型の違い
基本型と参照型では再代入での挙動で違いが出ます。
以下のサンプルコードは基本型の再代入しているコードです。こちらは直感的に分かると思います。
int a = 1;
int b = a; // bにはaの値:1が格納される
a = 2;
Systemout.println(a); // 2 が出力される
Systemout.println(b); // 1 が出力される
一方、参照型では以下のようになります。
基本型と同じような考え方では、b[0]は1を出力しそうな感じです。
ですが、参照型では変数に格納されるのはデータが格納されたメモリの場所だけです。
配列a宣言時、aには{1, 2, 3}
という配列の情報が格納されたメモリの場所情報が格納されます。
配列b宣言時、bにもaのもつ{1, 2, 3}
という配列のあるメモリ上の場所を格納します。
このとき、aもbも同じメモリの場所情報が入った変数となっています。
a[0] = 0;
では、aに格納されたメモリの場所にある配列{1, 2, 3}
の0番目の値を0に置き換えます。これでメモリ上に格納された配列は{0, 2, 3}
となりました。
よって、bに格納されたメモリ上の場所から配列の0番目を見てみても、出力される値は0となります。
int[] a = {1, 2, 3};
int[] b = a;
a[0] = 0;
Systemout.println(a[0]); // 0 が出力される
Systemout.println(b[0]); // 0 が出力される