Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaの静的制御フローとは?実行順序をサンプルコードで解説

Javaにおける静的制御フロー(Static Control Flow)とは、クラスがJVMによってロードされる際の処理・実行の順序を指します。大まかな流れは次のとおりです。

  1. 静的メンバー(static変数・staticメソッド)の識別
  2. 静的ブロック(staticイニシャライザ)の実行
  3. 静的な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メソッドの実行が完了しました

実行順序の解説

この出力結果は、次のような流れで処理が進んだために生まれています。

  1. クラスロード時:すべての静的変数にデフォルト値が割り当てられます(a = 0、b = 0)。
  2. 初期化フェーズ:記述順に従い、まず a に 97 が代入されます。
  3. 第1の静的ブロック:a の値「97」を出力した後、print() を呼び出します。しかし、この時点で b はまだ初期化されていないため、デフォルト値の「0」が出力されます。
  4. 第2の静的ブロック:メッセージが出力されます。
  5. 変数bの初期化:b に 899 が代入されます。
  6. mainメソッド:print() を呼び出すと、今度は初期化済みの「899」が出力され、最後に完了メッセージが表示されます。

このように、「静的メンバーの識別 → 静的ブロックの実行 → main メソッドの実行」という順序、そして静的変数と静的ブロックが記述順に処理されるというルールを理解しておくと、一見不思議な出力結果も論理的に説明できるようになります。この挙動はJavaの資格試験などでも頻出のトピックなので、しっかり押さえておきましょう。

  1. Java 8のインターフェースで使える静的メソッドの基本と実践例

    Java 8におけるインターフェースの静的メソッドとはJava 8以降、インターフェースには静的メソッド(staticメソッド)を定義できるようになりました。これにより、ユーティリティ的なヘルパーメソッドをインターフェース内に直接記述でき、関連する処理をひとまとめに管理しやすくなります。静的メソッドは「インターフェース名.メソッド名()」の形式で呼び出すのが基本です。実装クラスのインスタンスからは直接呼び出せず、オーバーライドもできない点に注意しましょう。静的メソッドを持つインターフェースの定義例次の例では、Vehicleインターフェースにデフォルトメソッド print() と、静的メソッド

  2. Javaの制御フロー構文を徹底解説:if、else、switchの使い方と実例コード

    Javaには、プログラムの流れ(制御フロー)を操作するための方法がいくつか用意されています。制御フロー文は、条件分岐の仕組みを実装することで、プログラムの実行の流れを変更したり中断したりします。 Javaにおける条件分岐のための主な構文は以下の3つです。 if 文 if...else 文 switch 文 この記事では、Javaの制御フロー構文について、それぞれの説明と実際のコード例を交えて詳しく解説します。 Javaのif文とは if 文の基本構文は次のとおりです。 if(condition) { // 条件がtrueの場合にのみ、このコードが実行される } if