14

この質問にはすでに答えがあります。

クラスが次のように宣言されているのを見ました。staticjavaしかし、混乱しました:

クラスはオブジェクトを作成するために使用され、オブジェクトが異なるとメモリ割り当ても異なります。

それでは何ですか"static"クラスを宣言するときに使用されますか。member variables全てですstatic

これは意味がありますか?


3 답변


27

まず、最上位クラスを静的にすることはできません。入れ子になったクラスを静的にすることしかできません。入れ子になったクラスを静的にすることによって、基本的に、あなたはそれをあなたの外側のクラス/トップレベルクラスから使うために入れ子にされたクラスのインスタンスは必要ないと言っています。

例:

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)静的な入れ子クラスは内部クラスではないのでできるここで静的メンバーを宣言します。

クラスを入れ子クラスに入れ子にすることはできますか?

一言で言えば、はい。以下を見てください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 {

            }
        }   
    }
}


  • 内部クラスは定義上静的ではありません。 - assylias
  • @assylias true .. :)、編集済み - PermGenError
  • @ PermGenErrorなので、せいぜい2つのレベルがあります。 - Al2O3
  • @Rubbyどういう意味ですかlevel?、ネストしたクラス(静的/非静的)は単に最上位クラスのメンバーです:) - PermGenError
  • '入れ子になったクラスを静的にすることで、基本的に、外部クラスや最上位クラスから使用するために入れ子になったクラスのインスタンスは必要ないと言っているのです。正しくありません。のインスタンスは必要ありません。外ののインスタンスを作成するクラス静的ネストクラス。 '外側のクラスのメンバーにアクセスできない'また間違っている:それはアクセスすることができますstaticメンバー - user207421

6

入れ子になったクラス(クラス内のクラス)は、静的に宣言できる唯一のクラスです。これは、ネストしたクラスにアクセスするために親クラスをインスタンス化する必要がないためです。

いくつかの良い例のコードがありますこの答え


1

このクラスとそれを含むクラスの関係について説明しています。

内部クラス別のクラスの範囲内で定義されたクラスです。内部クラスのインスタンスは、コンテナクラスの特定のインスタンス(それらが作成されたインスタンス)に関連付けられます。

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

リンクされた質問


関連する質問

最近の質問