HOWTO · Java

Java で静的とはどういう意味ですか

この記事では、Java の static キーワードを紹介します。

このページの内容

Java 言語では、static はさまざまな場所で使用できるキーワードです。static キーワードは、メンバー変数、メンバー関数、ブロック、およびネストされたクラスとともに使用されます。静的キーワードの適用は、毎回新しいインスタンスを作成したくない場所です。代わりに、単一のコピーがクラス内で共有される場所で使用します。静的変数は、永続メモリの一種であるヒープメモリに格納されます。

Java でのメンバー変数とともに static キーワードの使用

コードブロックは、静的変数が非静的変数とどのように異なるかを説明します。

public class StaticVariableUsage {
  public static void main(String[] args) {
    InnerClass in = new InnerClass();
    InnerClass in1 = new InnerClass();

    InnerClass2 in2 = new InnerClass2();
    InnerClass2 in3 = new InnerClass2();
  }

  static class InnerClass {
    static int var4 = 0;
    InnerClass() {
      var4++;
      System.out.println("static variable : " + var4);
    }
  }

  static class InnerClass2 {
    int var5 = 0;
    InnerClass2() {
      var5++;
      System.out.println("non-static variable : " + var5);
    }
  }
}

上記のコードブロックには、StaticVariableUsage クラスという名前のパブリッククラスがあります。1つの静的メソッドと 2つの内部クラスがあります。InnerClass という名前の内部クラスには静的整数変数 var4 があり、ゼロで開始されます。このクラスには、静的整数変数をインクリメントしてその値を出力するコンストラクターがあります。

別の内部クラスは InnerClass2 という名前を持ち、非静的変数 var5 を保持します。このクラスには、非静的変数をインクリメントしてその値を出力するコンストラクターもあります。

main メソッドに移動すると、ここでは、InnerClassInnerClass2 が 2 回インスタンス化されます。コンストラクター呼び出しが発生すると、オブジェクトが新しいキーワードでインスタンス化されたときに分析を導き出すことができます。

出力が示すように、静的変数が開始され、保持されます。値は初めてインクリメントされ、1 として出力されます。次回、別のインスタンスを作成すると、コンストラクターが再度呼び出されます。ただし、静的変数はゼロで再初期化されません。代わりに、以前に保存された値がインクリメントされるため、静的変数の値は 2 になります。

同様に、InnerClass2 のインスタンスが作成されると、非静的変数が値 0 に初期化されるたびに。そのため、両方の時間で値を 1 として出力します。

static variable : 1
static variable : 2
non-static variable : 1
non-static variable : 1

Java でのメンバー関数とともに static キーワードの使用

以下のクラスの他の内部クラスを保持する StaticFunctionUsage クラスという名前の外部クラスがあります。InnerClass には静的関数があります。また、InnerClass1 という名前の別の内部クラスには非静的メソッドがあります。

ここで、main メソッドに移ると、静的関数にクラス名で直接アクセスできることがわかります。InnerClass オブジェクトをインスタンス化する必要はありません。同様に、クラス名を使用して非静的関数 function1 にアクセスしようとすると、コンパイル時エラーが発生します。関数にアクセスする場合は、in 変数という名前で作成したクラスインスタンスを作成する必要があります。変数の使用は function1 を呼び出すことであり、有効なステートメントです。

public class StaticFunctionUsage {
  public static void main(String[] args) {
    InnerClass.function();
    // InnerClass1.function1();
    InnerClass1 in = new InnerClass1();
    in.function1();
  }

  static class InnerClass {
    static void function() {
      System.out.println("In the static function");
    }
  }

  static class InnerClass1 {
    void function1() {
      System.out.println("In the non-static function");
    }
  }
}

上記のコードブロックの出力は次のとおりです。

In the static function
In the non-static function

Java のブロックでの static キーワードの使用

静的ブロックの使用は、静的変数を初期化することです。プログラムの実行は、main メソッドから始まります。静的ブロックがクラス内に存在する場合、メインメソッドの実行前に実行されます。

以下は静的ブロックを説明するコードです。

public class StaticBlock {
  static {
    System.out.println("In the static block");
  }

  public static void main(String[] args) {
    System.out.println("In the main method");
  }
}

コードの出力は以下のとおりです。ご覧のとおり、静的ブロック内のステートメントが最初に実行されます。

In the static block
In the main method