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

Javaの静的ブロックとコンストラクターの違いとは?実行タイミングと使い分けを徹底解説

Javaには、クラスやオブジェクトの初期化に関わる仕組みとして「静的ブロック(staticブロック)」と「コンストラクター」があります。どちらも初期化処理を記述するために使われますが、実行されるタイミングや役割が大きく異なります。本記事では、それぞれの特徴と違いをコード例とともに詳しく解説します。

静的ブロック(staticブロック)とは

  • 静的ブロックはクラスがロードされるタイミングで実行されます。
  • main()メソッドよりも先に実行されます。
  • 静的ブロックには名前がなく、引数や戻り値も持ちません。
  • クラスロード時に一度だけ実行したい処理(静的変数の初期化など)は、静的ブロック内に記述します。

構文

static {
    // 実行したい処理
}

コード例

public class StaticBlockTest {
    static {
        System.out.println("Static Block!");
    }
    public static void main(String args[]) {
        System.out.println("Welcome to Tutorials Point!");
    }
}

実行結果

Static Block!
Welcome to Tutorials Point!

この例では、main()メソッドの処理よりも先に静的ブロックが出力されています。これは、クラスがJVMによってロードされた時点で静的ブロックが自動的に実行されるためです。

コンストラクターとは

  • コンストラクターはオブジェクト(インスタンス)を生成するタイミングで実行されます。
  • クラス名と同じ名前を持つ必要があります。
  • 戻り値の型は宣言しません(voidも記述しません)。
  • オブジェクトを生成するたびに呼び出され、1つのオブジェクトに対して1回だけ実行されます。
  • オーバーロードにより、引数の異なる複数のコンストラクターを定義できます。

構文

public class MyClass {
    // コンストラクター
    MyClass() {
        // 初期化処理
    }
}

コード例

public class ConstructorTest {
    static {
        // 静的ブロック
        System.out.println("In Static Block!");
    }
    public ConstructorTest() {
        System.out.println("In a first constructor!");
    }
    public ConstructorTest(int c) {
        System.out.println("In a second constructor!");
    }
    public static void main(String args[]) {
        ConstructorTest ct1 = new ConstructorTest();
        ConstructorTest ct2 = new ConstructorTest(10);
    }
}

実行結果

In Static Block!
In a first constructor!
In a second constructor!

この例では、まずクラスロード時に静的ブロックが1度だけ実行され、その後オブジェクトを生成するたびに対応するコンストラクターが呼び出されています。引数なしのコンストラクターとint型の引数を持つコンストラクター(オーバーロード)が、それぞれ正しく実行されている点にも注目してください。

静的ブロックとコンストラクターの違いまとめ

項目静的ブロックコンストラクター
実行タイミングクラスのロード時オブジェクト生成時
実行回数クラスごとに1回のみオブジェクトごとに1回(生成のたび)
名前名前を持たないクラス名と同じ名前が必要
主な用途静的変数の初期化などインスタンス変数の初期化など
オーバーロード不可可能

まとめ

静的ブロックは「クラス単位」で1回だけ実行される初期化処理であり、コンストラクターは「オブジェクト単位」で生成のたびに実行される初期化処理です。クラス全体で共有する設定や静的リソースの準備には静的ブロックを、個々のインスタンスの状態初期化にはコンストラクターを使用するなど、目的に応じて適切に使い分けることが重要です。

  1. JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説

    JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ

  2. JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント

    JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ