Javaのクラスで使える変数は3種類!ローカル変数・インスタンス変数・static変数の違いを解説
Javaのクラスで扱える変数には、大きく分けて3つの種類があります。それは「ローカル変数(local variables)」「インスタンス変数(instance variables)」「クラス変数/静的変数(class/static variables)」です。
それぞれ宣言する場所や生存期間(ライフサイクル)が異なるため、用途に応じて正しく使い分けることが、バグの少ない読みやすいコードを書く第一歩となります。本記事では、各変数の特徴とサンプルコードを交えてわかりやすく解説します。
1. ローカル変数(Local Variable)
ローカル変数とは、メソッド内・コンストラクタ内・コードブロック(if文やfor文など)の中で宣言される変数のことです。
- プログラムの制御がメソッドやブロックに入ったときに生成され、抜けた時点で破棄されます。
- 宣言したメソッドやブロックの外からはアクセスできません。
- 必ず初期化してから使う必要がある点に注意してください。初期化せずに参照するとコンパイルエラーになります。
サンプルコード
public class LocalVariableTest {
public void show() {
int num = 100; // ローカル変数
System.out.println("The number is : " + num);
}
public static void main(String args[]) {
LocalVariableTest test = new LocalVariableTest();
test.show();
}
}実行結果
The number is : 100
この例では、変数 num は show() メソッド内でのみ有効なローカル変数です。メソッドの実行が終わると自動的にメモリから解放されます。
2. インスタンス変数(Instance Variable)
インスタンス変数とは、クラスの中で、かつメソッド・コンストラクタ・ブロックの外側で宣言される変数のことです。
- オブジェクト(インスタンス)が生成されたときに作成され、オブジェクトが破棄されるときに消滅します。
- オブジェクトごとに独立した値を持つため、同じクラスから複数のインスタンスを作っても、それぞれ別々の値を保持できます。
- 明示的に初期化しない場合、データ型に応じたデフォルト値(intなら0、booleanならfalse、参照型ならnullなど)が自動的に設定されます。
サンプルコード
public class InstanceVariableTest {
int num; // インスタンス変数
InstanceVariableTest(int n) {
num = n;
}
public void show() {
System.out.println("The number is: " + num);
}
public static void main(String args[]) {
InstanceVariableTest test = new InstanceVariableTest(75);
test.show();
}
}実行結果
The number is : 75
この例では、num がインスタンス変数です。コンストラクタで値を代入しており、この値は test オブジェクトが存在する限り保持され続けます。
3. クラス変数/静的変数(Static/Class Variable)
staticキーワードを使って宣言された変数をクラス変数(静的変数)と呼びます。
- クラス内で、かつメソッドやコードブロックの外側で宣言します。
- プログラムの開始時に生成され、プログラム終了時に破棄されます。
- すべてのオブジェクトで値が共有されるのが最大の特徴です。そのため「オブジェクトの生成数のカウント」や「共通設定値の保持」などによく使われます。
- オブジェクトを生成しなくても「クラス名.変数名」の形式で直接アクセスできます。
サンプルコード
public class StaticVariableTest {
int num;
static int count; // static変数(クラス変数)
StaticVariableTest(int n) {
num = n;
count++;
}
public void show() {
System.out.println("The number is: " + num);
}
public static void main(String args[]) {
StaticVariableTest test1 = new StaticVariableTest(75);
test1.show();
StaticVariableTest test2 = new StaticVariableTest(90);
test2.show();
System.out.println("The total objects of a class created are: " + count);
}
}実行結果
The number is: 75 The number is: 90 The total objects of a class created are: 2
この例では、オブジェクトが生成されるたびにコンストラクタ内で count がインクリメントされています。test1 と test2 の2つのオブジェクトが同じ count を共有しているため、「2」という合計値が出力されます。
3つの変数の違いまとめ
| 種類 | 宣言場所 | 生成タイミング | 破棄タイミング | 共有範囲 |
|---|---|---|---|---|
| ローカル変数 | メソッド・ブロック・コンストラクタ内 | 制御がブロックに入ったとき | ブロックを抜けたとき | そのブロック内のみ |
| インスタンス変数 | クラス直下(メソッド外) | オブジェクト生成時 | オブジェクト破棄時 | オブジェクトごとに独立 |
| static変数 | クラス直下+static修飾子 | プログラム開始時(クラスロード時) | プログラム終了時 | 全オブジェクトで共有 |
まとめ
Javaの変数は「宣言する場所」と「staticが付くかどうか」によって、ローカル変数・インスタンス変数・static変数の3種類に分類されます。それぞれのスコープ(有効範囲)とライフサイクルを理解して使い分けることで、メモリ効率が良く保守性の高いプログラムを書けるようになります。特に初心者の方は、ローカル変数の初期化忘れによるコンパイルエラーや、static変数の意図しない共有に注意しましょう。
-
Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説
@Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性
-
JavaにおけるCursorクラスの役割とは?マウスカーソル制御の基本を解説
JavaのCursorクラスとはCursorクラスは、Objectクラスのサブクラスであり、画面上のポイント(指し示す位置)やインジケーター(表示標識)として定義されます。ユーザーがマウスを使ってシステムへの入力を選択・操作する際に、その位置を視覚的に示す重要な役割を担っています。GUIアプリケーションでは、状況に応じてカーソルの形状を変えることで、ユーザーに対して直感的なフィードバックを提供できます。例えば、処理中であることを伝える砂時計型のカーソルや、クリック可能な要素を示す手型のカーソルなどが代表的な例です。利用可能なカーソルの種類Cursorクラスには、あらかじめ定義されたさまざまなカ