基本型と参照型
Javaの変数の型は基本型と参照型の2つに分けることができる.例を挙げると以下のようになる.
- 基本型(プリミティブ型, 値型とも)
- int
- long
- float
- double
- boolean
- 参照型
- クラス (Turtle, Vector, Point, Stringなど)
- 配列
両者の違いは変数の内容の記憶方法である.
基本型
基本型では変数の宣言時に値を入れる記憶領域が確保される.
上の例によって説明すると,
int i, j; によってiとjと名付けられた整数を格納できる記憶領域が確保される.
i = 1; によってiに整数値1が格納される.
j = i; によってiに格納されている整数値1がjに複製され,jに格納される.
i = 2; によってiに整数値2が格納される.jには影響はない.
以上のように,宣言した変数の分だけ値を格納する領域が存在するのが基本型である.
参照型
参照型では変数の宣言時には値(オブジェクトや配列の実体)を入れる領域は確保されず,
これらの実体を指し示す情報を格納する領域が確保される.
上の例によって説明すると,
Turtle kamekichi, kameziro; によってkamekichi, kameziroと名付けられたTurtleの実体を
指し示す情報を格納できる記憶領域(Turtle型)が確保される.
new Turtle(100, 200); によってTurtleの実体が用意され,これにID(識別子)が割り当てられる.
IDはJavaの処理系が自動的に決定する.
kamekichi = new Turtle(100, 200); によってTurtleの実体のIDが変数kamekichiに格納される.
これにより変数kamekichiを介してTurtleの実体を参照できる.
kameziro = kamekichi; によって変数kamekichiに格納されている値,すなわちID:1000がkameziroにも複製されて格納される.
複製されるのはIDであって,実体ではない点に注意.
kamekichi, kameziroはともに同じ実体を参照していることになる.
kameziro.move(50); によってID:1000の実体に対してmove(50)というメソッド呼出しが行われ,実体は50移動する.
同じくID:1000が格納されているkamekichiが参照する実体も50移動しているものになる.
nullはどの実体も示さない特別なIDである.kamekichi = null; とすることで,変数kamekichiはどの実体も示していないことになる.
変数kameziroには影響はなく,ID:1000の実体を示したままである.
もし,この後に,kamekichi.move(10); などを実行しようとすると,kamekichiはnullであり,実体を示していないので,
java.lang.NullPointerExceptionという実行時の例外が起きる.
このように参照型の変数は,実体のIDを格納するための変数になる.