Javaの静的制御フローとは?実行順序をサンプルコードで解説
Javaにおける静的制御フロー(Static Control Flow)とは、クラスがJVMによってロードされる際の処理・実行の順序を指します。大まかな流れは次のとおりです。
- 静的メンバー(static変数・staticメソッド)の識別
- 静的ブロック(staticイニシャライザ)の実行
- 静的な
mainメソッドの実行
ここで重要なのは、静的変数への代入と静的ブロックがソースコード上の記述順に実行されるという点です。このため、宣言より前の位置にあるコードから変数を参照すると、デフォルト値が見えることがあります。以下の例で確認してみましょう。
コード例
public class Demo {
static int a = 97;
public static void main(String[] args) {
print();
System.out.println("mainメソッドの実行が完了しました");
}
static { // 第1の静的ブロック
System.out.println(a);
print();
System.out.println("1つ目の静的ブロック内です");
}
public static void print() {
System.out.println(b);
}
static { // 第2の静的ブロック
System.out.println("2つ目の静的ブロック内です");
}
static int b = 899;
}
実行結果
97 0 1つ目の静的ブロック内です 2つ目の静的ブロック内です 899 mainメソッドの実行が完了しました
実行順序の解説
この出力結果は、次のような流れで処理が進んだために生まれています。
- クラスロード時:すべての静的変数にデフォルト値が割り当てられます(a = 0、b = 0)。
- 初期化フェーズ:記述順に従い、まず
aに 97 が代入されます。 - 第1の静的ブロック:
aの値「97」を出力した後、print()を呼び出します。しかし、この時点でbはまだ初期化されていないため、デフォルト値の「0」が出力されます。 - 第2の静的ブロック:メッセージが出力されます。
- 変数bの初期化:
bに 899 が代入されます。 - mainメソッド:
print()を呼び出すと、今度は初期化済みの「899」が出力され、最後に完了メッセージが表示されます。
このように、「静的メンバーの識別 → 静的ブロックの実行 → main メソッドの実行」という順序、そして静的変数と静的ブロックが記述順に処理されるというルールを理解しておくと、一見不思議な出力結果も論理的に説明できるようになります。この挙動はJavaの資格試験などでも頻出のトピックなので、しっかり押さえておきましょう。
-
Java 8のインターフェースで使える静的メソッドの基本と実践例
Java 8におけるインターフェースの静的メソッドとはJava 8以降、インターフェースには静的メソッド(staticメソッド)を定義できるようになりました。これにより、ユーティリティ的なヘルパーメソッドをインターフェース内に直接記述でき、関連する処理をひとまとめに管理しやすくなります。静的メソッドは「インターフェース名.メソッド名()」の形式で呼び出すのが基本です。実装クラスのインスタンスからは直接呼び出せず、オーバーライドもできない点に注意しましょう。静的メソッドを持つインターフェースの定義例次の例では、Vehicleインターフェースにデフォルトメソッド print() と、静的メソッド
-
Javaの制御フロー構文を徹底解説:if、else、switchの使い方と実例コード
Javaには、プログラムの流れ(制御フロー)を操作するための方法がいくつか用意されています。制御フロー文は、条件分岐の仕組みを実装することで、プログラムの実行の流れを変更したり中断したりします。 Javaにおける条件分岐のための主な構文は以下の3つです。 if 文 if...else 文 switch 文 この記事では、Javaの制御フロー構文について、それぞれの説明と実際のコード例を交えて詳しく解説します。 Javaのif文とは if 文の基本構文は次のとおりです。 if(condition) { // 条件がtrueの場合にのみ、このコードが実行される } if