ローカル変数
Javaにおける変数は大別して4種類ある。
インスタンス変数 - クラスの各インスタンスに対して1つ存在
クラス変数 - クラスに対して1つ存在
ローカル変数 - メソッド内で宣言されている変数
仮引数 (parameters)
配列の要素は「インスタンス変数」に分類される。メソッド、コンストラクタ、catch節の引数は「仮引数」に分類される。
Javaにおいては、メソッド内で宣言されている変数をローカル変数と呼ぶ。スコープの概念およびブロックの構文はC/C++とほぼ同様だが、C/C++と異なり、静的ローカル変数は定義できない。フィールド(インスタンス変数とクラス変数)に関しては、コンパイラが型に応じて適切な既定値を割り当てるが、ローカル変数に関しては既定値は割り当てられない。
下記の例において、3行目で宣言されているローカル変数iのスコープは3行目から7行目の中括弧までであり、5行目で宣言されているローカル変数jのスコープは5行目から6行目の中括弧までである。
以下のような未初期化のローカル変数にアクセスするコードは、C/C++では未定義動作を引き起こすものの、コンパイルは通ってしまう。一方、Javaではコンパイルエラーとなる。
Javaのメモリ解放はガベージコレクションによって行なわれる。Javaのローカル変数はスタック領域に確保されるが、クラスや配列などの参照型の場合、オブジェクト本体はヒープ領域に作成される。ローカル変数の寿命が尽きて、その変数が指していたオブジェクトがまったく参照されなくなったとしても、そのオブジェクトのメモリ領域が直ちに解放されるとは限らない。