静的修飾子は、静的フィールドまたはクラス変数を宣言するために使用されます。
それらは、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定された場所にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。
出典:「インスタンスとクラスのメンバーについて」
また、Javaは静的変数とメソッドの両方をサポートしていることに注意してください。したがって、これを実行すると、最初のクラスは正しくコンパイルされますが、他の2つは失敗します。
例を挙げると、次のようになります。
class A{
public static int STATIC_VALUE = 1; // is a valid static variable
public static void method1(){
//is a valid static method
}
/**
* Is a valid static inner class
*/
static class innerClassB{
}
}
しかし、なぜ静的クラスを宣言するのでしょうか?
それをしたいと思う理由にはいくつかの理由があります。たとえば、このJavaチュートリアルから:
静的にネストされたクラスは、他のトップレベルクラスと同じように、その外部クラス(および他のクラス)のインスタンスメンバーと対話します。事実上、静的にネストされたクラスは、動作上、パッケージ化の便宜のために別のトップレベルクラスにネストされたトップレベルクラスです。
この良い例は、 HashMapクラスstatic class Entry<K,V> implements Map.Entry<K,V>
のような場所で使用されています。
Entryクラスの存在は、HashMapがコンテンツとして格納されているキーと値のペアを格納/取得する方法の機能と密接に関連しています。ご覧のとおり、Entryクラスは、動作上はトップレベルクラスと同等ですが、HashMap実装にのみ機能を提供します。したがって、HashMap定義自体の一部としてパッケージ化することは理にかなっています。
private static class Entry<E>
LinkedListの実装で も同様の使用法を見つけることができます。
私が考えることができるもう1つの理由は、ホワイトボックステストの方法です。内部静的クラスは外部クラスのプライベートおよび保護された静的変数/メソッドにアクセスできるため、これを使用して外部クラスの内部状態をテストできます。これを汚いと考える人もいるかもしれませんが、それが役立つ場合もあります
私の意見では、静的内部クラスは主に便宜上のものであり、通常は設計原則に基づいています。