HOWTO · Java

Java の静的クラス

この記事では、Java 静的クラスを紹介します。

Java 言語では、外部クラスを静的クラスとして作成することはできませんが、ネストされた内部クラスを静的クラスとして作成する特権があります。静的クラスのプロパティは次のとおりです。

静的内部クラスは、外部クラスの非静的メンバーにアクセスすることはできません。

静的内部クラスは、メンバー変数にアクセスするために外部クラス参照を必要としません。

静的クラスはインスタンス化できません。したがって、メソッドにはクラス名で直接アクセスできます。

以下は、上記の 2 行を示すコードです。

package static_class;

public class StaticInnerClass {
  static int i = 1;
  int j = 9;

  public static void main(String[] args) {
    StaticInnerClass s = new StaticInnerClass();
    // s.InnerClass.printNum();
    InnerClass.printNum();
  }

  public static class InnerClass {
    public static void printNum() {
      System.out.println(i);
      // System.out.println(j);
    }
  }
}

上記のコードでは、StaticInnerClass という名前の外部クラスを作成しました。このクラスには、静的フィールド、非静的フィールド、静的メソッド、および静的内部クラスがあります。静的 main メソッドでは、s オブジェクトという名前の外部クラスのインスタンスを作成しました。外部クラスオブジェクト、つまり s.InnerClass.printNum(); を使用して内部クラス printNum() メソッドにアクセスしようとすると、IDE はコンパイル時エラーを出します。これは、静的内部クラスが内部クラスメソッドにアクセスするために外部クラス参照オブジェクトの参照を必要としないことを示します。したがって、クラス名で内部クラスメソッドに直接アクセスできます。

ここで、printNum() メソッドの定義を確認します。2つの print ステートメントがあります。最初に外部クラスの静的フィールドを出力し、次に同じものの非静的変数を出力しようとします。ステートメント System.out.println(i); は有効です。つまり、静的コンテキストからのみ静的メンバーにアクセスできます。しかし、2 番目のステートメント System.out.println(j); を見てください。静的コンテキストから非静的メンバーにアクセスすることはできないため、は無効です。

Java クラスでは、外部クラス static クラスを作成することはできません。ただし、いくつかの定義済みキーワードを使用して動作を模倣することはできます。

final キーワードの使用は、クラスを final にすることです。このキーワードは、クラスがそれ以上拡張することを禁止します。その理由は、静的クラスの拡張には役に立たないからです。

静的クラスのインスタンス化を防ぐため、private キーワードを使用してコンストラクターをプライベートにします。静的クラスのプロパティが言うように、それをインスタンス化することはできません。

メンバー変数とメンバーメソッドで static キーワードを使用します。オブジェクトが作成されないため、非静的メンバーのフィールドや関数にアクセスすることはできません。

以下は、定義された静的クラスであり、その使用法は、このクラスのオブジェクト作成が不要な Utility クラスの作成に見られます。

package static_class;

public final class StaticClass {
  private static int a = 1;

  private StaticClass() {
    System.out.println("Cannot be instantiated");
  }

  public static void printNum() {
    System.out.println(a);
  }
}