Javaにおける静的変数(static変数)と非静的変数(インスタンス変数)の違いを徹底解説
変数とは、プログラムが操作できる名前付きの記憶領域のことです。Javaの各変数には必ず特定の型が存在し、その型によって以下の要素が決まります。
- 変数のメモリサイズとレイアウト
- そのメモリに格納できる値の範囲
- 変数に対して適用できる演算の種類
Javaの変数は大きく「静的変数(static変数)」と「非静的変数(インスタンス変数)」の2種類に分けられます。それぞれの特徴を見ていきましょう。
静的変数(Static Variable)とは
静的変数は「クラス変数」とも呼ばれ、クラスのすべてのオブジェクト(インスタンス)で共通して使われる変数です。インスタンスを生成しなくても、クラス名を指定することで直接アクセスできます。
public static int staticCounter = 0;
非静的変数(Non-Static Variable)とは
クラス内で宣言された変数のうち、staticキーワードが付いていないものを「非静的変数」または「インスタンス変数」と呼びます。この変数は、オブジェクトを生成したタイミングで個別に作成され、各インスタンスごとに独立した値を持ちます。
静的変数と非静的変数の主な違い
両者の違いを、アクセス・共有・メモリ割り当て・キーワードの観点から整理すると次の表のようになります。
| No. | 項目 | 静的変数(static) | 非静的変数(インスタンス変数) |
|---|---|---|---|
| 1 | アクセス | 静的メンバーだけでなく、非静的メンバーメソッドからもアクセス可能です。 | 静的メンバーメソッドからはアクセスできません。 |
| 2 | 共有 | グローバル変数のように振る舞い、クラスのすべてのオブジェクト間で共有されます。 | 生成されたインスタンスオブジェクトごとに固有の値を持ちます。 |
| 3 | メモリ割り当て | 占有する領域が小さく、メモリへの割り当ては一度だけ行われます。 | より多くのメモリを消費する場合があります。割り当ては実行時に行われます。 |
| 4 | キーワード | 宣言時にstaticキーワードが必要です。 | 特別なキーワードは不要です。 |
静的変数と非静的変数の動作確認サンプルコード
実際のコードで両者の挙動の違いを確認してみましょう。
JavaTester.java
public class JavaTester {
public int counter = 0;
public static int staticCounter = 0;
public JavaTester(){
counter++;
staticCounter++;
}
public static void main(String args[]) {
JavaTester tester = new JavaTester();
JavaTester tester1 = new JavaTester();
JavaTester tester2 = new JavaTester();
System.out.println("Counter: " + tester2.counter);
System.out.println("Static Counter: " + tester2.staticCounter);
}
}実行結果
Counter: 1 Static Counter: 3
この実行結果から、重要なポイントが読み取れます。
- counter(非静的変数): インスタンスごとに独立しているため、tester2自身のコンストラクタで1回だけインクリメントされた値「1」が出力されます。
- staticCounter(静的変数): 3つのインスタンスすべてで共有されているため、コンストラクタが合計3回実行された結果「3」が出力されます。
このように、静的変数はクラス全体で1つだけ存在するのに対し、非静的変数はインスタンスごとに個別のコピーが作られる点が最大の違いです。カウンターのような共有データには静的変数を、オブジェクトごとの状態管理には非静的変数を使うのが適切です。
-
Javaの静的ブロックとコンストラクターの違いとは?実行タイミングと使い分けを徹底解説
Javaには、クラスやオブジェクトの初期化に関わる仕組みとして「静的ブロック(staticブロック)」と「コンストラクター」があります。どちらも初期化処理を記述するために使われますが、実行されるタイミングや役割が大きく異なります。本記事では、それぞれの特徴と違いをコード例とともに詳しく解説します。 静的ブロック(staticブロック)とは 静的ブロックはクラスがロードされるタイミングで実行されます。 main()メソッドよりも先に実行されます。 静的ブロックには名前がなく、引数や戻り値も持ちません。 クラスロード時に一度だけ実行したい処理(静的変数の初期化など)は、静的ブロック内に記述しま
-
Javaのimport文とstatic import文の違いをわかりやすく解説
Javaでは、import文を使うことで、特定のパッケージに属するクラスやインターフェースを取り込むことができます。import文を使用すれば、毎回完全修飾名(FQCN)を記述する必要がなく、クラス名だけで直接コードに書けるようになります。一方、static import文は、特定のクラスやパッケージからstaticメンバー(静的メンバー)をインポートするための構文です。static importを使えば、staticメンバーへアクセスする際にクラス名を指定する必要がなくなり、メンバー名を直接記述できるようになります。import文の基本別パッケージのクラスやメソッドにアクセスするには、完全修