Javaの変数のスコープと存続期間を徹底解説!インスタンス変数・クラス変数・ローカル変数の違い
Javaでは、変数が「どこで宣言されたか」によって、その変数にアクセスできる範囲(スコープ)や、メモリ上で生き続ける期間(存続期間・ライフタイム)が異なります。この記事では、Javaの変数をインスタンス変数・クラス変数・ローカル変数の3種類に分けて、それぞれのスコープと存続期間の違いをわかりやすく解説します。
1. インスタンス変数(Instance Variables)
クラスの中で、かつすべてのメソッドやブロックの外側で宣言される変数をインスタンス変数と呼びます。オブジェクト(インスタンス)ごとに個別の値を持つのが特徴です。
- スコープ: 基本的にはクラス全体。ただし、staticメソッドからは直接アクセスできません。
- 存続期間: オブジェクトがメモリ上に存在している間。ガベージコレクションによってオブジェクトが破棄されると、変数も一緒に解放されます。
2. クラス変数(Class Variables)
クラスの中で宣言され、staticキーワードが付いた変数をクラス変数(静的変数)と呼びます。すべてのオブジェクトで値が共有される点が大きな特徴です。
- スコープ: クラス全体。staticメソッドからでも直接アクセスできます。
- 存続期間: プログラムの終了まで、またはそのクラスがJVM(Java仮想マシン)からアンロードされるまで。
3. ローカル変数(Local Variables)
上記の2つ以外の変数は、すべてローカル変数として扱われます。メソッド内で宣言された変数に加え、メソッドの引数(パラメータ)もローカル変数に含まれる点に注意しましょう。
- スコープ: 宣言されたブロック({}の中)のみ。
- 存続期間: 制御がそのブロックを抜けるまで。
3種類の変数の比較まとめ
| 種類 | 宣言場所 | スコープ | 存続期間 |
|---|---|---|---|
| インスタンス変数 | クラス直下(非static) | クラス全体※staticメソッド以外 | オブジェクトが存在する間 |
| クラス変数 | クラス直下+static | クラス全体 | プログラム終了まで/クラスがロードされている間 |
| ローカル変数 | メソッド・ブロック内 | 宣言されたブロック内 | ブロックを抜けるまで |
まとめ
Javaの変数は、宣言する場所とstaticの有無によって、スコープと存続期間が大きく変わります。
・インスタンス変数:オブジェクトと運命を共にする
・クラス変数:プログラムが動いている限り生存し、全インスタンスで共有
・ローカル変数:ブロックを出たら消える
この違いを正しく理解することで、意図しないバグを防ぎ、メモリ効率の良いプログラムを書けるようになります。
-
Javaの定数とfinal変数の違いとは?static finalの正しい使い方を解説
Javaにおける定数(Constant)とは定数とは、値が固定されており、プログラム内にそのコピーが1つだけ存在する変数のことです。定数として宣言し、一度値を代入すると、以降はプログラムのどこであってもその値を変更することはできません。C言語と異なり、Javaでは定数を直接サポートしていません。しかし、変数をstaticとfinalの両方で宣言することで、定数を作成することが可能です。staticを付けて宣言すると、その変数はコンパイル時にメモリへロードされます。つまり、プログラム全体でコピーは1つだけしか存在しません。finalを付けて宣言すると、その変数の値を再度変更することができなくなり
-
Javaのローカル変数とは?特徴と使い方をサンプルコード付きで解説
Javaにおけるローカル変数(局所変数)は、メソッド、コンストラクタ、またはブロックの中で宣言される変数です。これらの変数は、処理が開始されるときに生成され、そのメソッド・コンストラクタ・ブロックを抜けると自動的に破棄されます。 ローカル変数の主な特徴 アクセス修飾子は使用不可:publicやprivateなどのアクセス修飾子を付けることはできません。 スコープが限定される:宣言されたメソッド・コンストラクタ・ブロック内でのみ参照可能です。 スタックで管理される:内部的にはスタック領域に実装されます。 使用前に初期化が必要:値を代入せずに使うとコンパイルエラーになります。 ローカル変数のサ