static クラスに static と宣言されていないメソッドが含まれているコードを見つけました。コンパイラは警告を表示しません。ややこしいですね。
6 に答える
Javaには静的クラスの概念はありません(静的内部クラスでさえありません)。クラスが静的であり、動作状態にある場合は、静的として宣言されている内部クラス (ネストされたクラスとも呼ばれます) である必要があります。また、静的内部クラスに静的メソッドのみを含めるという制限はありません。
内部クラスを静的に宣言することの重要性は、ネストされているクラスとは無関係に、ネストされたクラスのインスタンスを作成できるようにすることです。static が言及されていない場合、ネストされたクラスのすべてのインスタンスは、ネストされているクラスのインスタンスに関連付けられます。
この質問には詳細があります。 Java 内部クラスと static ネストされたクラス
静的クラスは、外部クラスへの暗黙の参照を持たないネストされたクラスです。静的クラスは、静的メソッドまたはインスタンスメソッドを持つことができます。注:内部クラスに静的メソッドを含めることはできません。
Javaには「静的クラス」のようなものはありません(少なくとも、あなたがそれを理解しているように見える方法では)。C#には、インスタンス化できず、非静的メンバーを持つことができない「静的クラス」があります。その概念はJavaには明示的に存在しません(ただし、すべてのコンストラクターを作成することで同じ効果を得ることができますprivate
)。
表示されているのは、おそらく次のような静的なネストされたクラスです。
class Foo {
static class Bar {
}
}
これは、インスタンス に外部インスタンスへの参照がないことを意味するだけです(修飾子がない場合のように)。Bar
Foo
Bar
static
Bar
それがトップレベルのクラスである場合、それが持つことができるあらゆる種類のメンバーを持つことができます。
宣言できるのは内部クラスのみstatic
です。静的クラスには外部クラスへのポインターがないため、外部クラスの静的フィールドとメソッドのみを参照できます。ただし、静的クラス自体に非静的メソッドが含まれる場合があります。
キーワードは、static
属性/メソッドとクラスでまったく異なります。
属性とメソッドの場合、クラスの生きているインスタンスなしで参照できる属性またはメソッドのインスタンスを 1 つだけ持つようにコンパイラに指示します。
はstatic class
内部クラスにのみ使用でき、囲んでいるクラスの既存のインスタンスなしでクラスを参照できることを示します。したがって、外部からアクセスする必要がある内部列挙に役立ちます。
しかし、 astatic class
は、それ自体の本体から、必要なものを参照できます。