web-dev-qa-db-ja.com

Javaでクラスが静的として宣言されているのはなぜですか?

クラスがstaticJavaとして宣言されているのを見ましたが、混乱しています:
オブジェクトを作成するためにクラスが使用され、オブジェクトごとに異なるメモリ割り当てがあるため。
次に、クラスを宣言するときに"static"は何に使用されますか?それは、member variablesがすべてstaticであることを意味しますか?
これは理にかなっていますか?

15
Al2O3

まず、トップレベルのクラスを静的にすることはできません。ネストされたクラスを静的にすることのみ可能です。ネストされたクラスを静的にすることにより、基本的には、ネストされたクラスのインスタンスを外部クラス/トップレベルクラスから使用する必要がないことを意味します。

例:

class Outer {

static class nestedStaticClass {

//its member variables and methods (don't nessarily need to be static)
//but cannot access members of the enclosing class
}

public void OuterMethod(){
//can access members of nestedStaticClass w/o an instance
}
}

また、定数である場合を除いて、内部クラス内で静的フィールドを宣言することは違法です(つまり、static final)。静的ネストクラスは内部クラスではないため、ここでは静的メンバーを宣言しますcan

クラスはネストされたクラスにネストできますか?

つまり、はい。以下のTestを見てください。ネストされた内部クラスとネストされた静的クラスの両方がネストされたクラスを持つことができます。ただし、静的クラスを宣言できるのは最上位のクラス内だけであり、内部クラス内で宣言することはできません。

public class Test {
    public class Inner1 {
        public class Inner2 {
            public class Inner3 {

            }
        }
    }
    public static class nested1 {
        public static class nested2 {
            public static class nested3 {

            }
        }   
    }
}
27
PermGenError

ネストされたクラス(クラス内のクラス)は、静的と宣言できる唯一のクラスです。これにより、ネストされたクラスにアクセスするために親クラスをインスタンス化する必要がなくなります。

この答え にいくつかの良いサンプルコードがあります

6
Jivings

このクラスとそれを含むクラスとの関係を説明するだけです。

内部クラスは、別のクラスのスコープ内で定義されたクラスです。内部クラスのインスタンスは、コンテナクラスの特定のインスタンス(それらが作成されたインスタンス)にアタッチされます。

静的ネストクラスはネストクラスですが、静的に定義されています。静的メンバーと同様に、特定のインスタンスとは関係ありません。それらは単に包含クラスに属します。ネストされたクラスでは、関連付けられている特定のインスタンスがないため、包含クラスの非静的メンバー/メソッドを参照することはできません。

2
Eyal Schneider