Java static 完全解説:変数・メソッド・ブロックの実践例
Java における static キーワードは、static 変数、static メソッド、static ブロック の3つの文脈で使用されます。それぞれがクラスとインスタンスのライフサイクルにおいて独自の役割を果たします。
Java の static 変数
static 変数は、クラスが最初にロードされるときに一度だけ初期化されるクラスレベルのフィールドです。インスタンス変数とは異なり、static 変数のコピーは1つだけで、そのクラスのすべてのオブジェクトで共有されます。
- コピーは1つだけで、すべてのインスタンスで共有される
- オブジェクトを作成せずに
クラス名.変数名で直接アクセス可能 - インスタンスフィールドより前に初期化される
構文:
public static int count;
Java の static メソッド
static メソッドは、特定のインスタンスではなくクラスに属します。オブジェクトを作成せずに呼び出せ、static データのみにアクセスできます。
- 他の static メソッドは呼び出せるが、インスタンスメソッドは呼べない
クラス名.メソッド名()で呼び出す- インスタンスに結びついていないため
thisやsuperは使用不可
すべての main メソッドが static なのは、JVM がオブジェクトを作成する前にアプリケーションを起動できるようにするためです。
実践例:static 変数とメソッドの使用
以下は、複数の Student オブジェクト間で static カウンタが共有されることを示すシンプルなプログラムです。
public class Demo {
public static void main(String[] args) {
Student s1 = new Student();
s1.showData();
Student s2 = new Student();
s2.showData();
// Student.b++; // アンコメントでカウンタを変更
// s1.showData();
}
}
class Student {
int a; // インスタンス変数、デフォルトは 0
static int b; // static カウンタ、一度だけ 0 で初期化
Student() {
b++; // Student が作成されるたびにカウンタをインクリメント
}
public void showData() {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
java Demo でコンパイル・実行すると以下の出力が得られます:
以下の図は、参照変数とオブジェクトの作成、および static 変数 b がインスタンス間で共有される様子を示しています。
クラス外部から static 変数にアクセスするには クラス名.変数名 を使用:
Student.b++; // 共有カウンタをインクリメント
s1.showData(); // 更新された b の値が表示される
static コンテキストからインスタンス変数にアクセスしようとするとコンパイルエラーになります:
error: non-static variable a cannot be referenced from a static context
a++;
これは static メソッドがインスタンスフィールドと直接やり取りできないためです。
Java の static ブロック
static ブロックは、クラスが最初に JVM にロードされたときに一度だけ実行される特殊なコードブロックです。単純な代入以上の初期化が必要な static フィールドの初期化に最適です。
class Test {
static int a;
static int b;
static {
a = 10;
b = 20;
}
}
以下のプログラムを実行すると static ブロックの出力が確認できます:
public class Demo {
static int a;
static int b;
static {
a = 10;
b = 20;
}
public static void main(String[] args) {
System.out.println("Value of a = " + a);
System.out.println("Value of b = " + b);
}
}
出力:
Value of a = 10 Value of b = 20
Java
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java例外ハンドリング完全攻略:try-catch、finally、throw、throws
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除
- Java インターフェース vs 抽象クラス:適切な抽象化の選び方