24

プログラミングの他のすべてのタイプの静的機能について私が知っていることを考えると、答えは「いいえ」だと思います。しかし、次のようなステートメントを見ると、OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();不思議に思います。

4

6 に答える 6

34

はい、staticネストされた型のセマンティクスには、それを止めるものは何もありません。このスニペットは問題なく動作します。

public class MultipleNested {
    static class Nested {
    }
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Nested();
        }
    }
}

こちらもご覧ください


もちろん、ネストされた型は独自のインスタンス コントロール (privateコンストラクタ、シングルトン パターンなど) を実行できますが、それはネストされた型であるという事実とは関係ありません。また、ネストされた型が a のstatic enum場合、もちろんインスタンス化することはできません。

しかし、一般に、staticネストされた型は複数回インスタンス化できます。

static技術的には、ネストされた型は「内部」型ではないことに注意してください。

JLS 8.1.3 内部クラスとそれを囲むインスタンス

内部クラスは、明示的または暗黙的に宣言されていないネストされたクラスですstatic

つまり、JLS の用語によれば、内部クラスはそうではないクラスですstatic。の場合static、それは単なるネストされた型です。


では、どういうstatic意味ですか?

static単純に、入れ子になった型は、囲んでいる型のインスタンスをインスタンス化する必要がないことを意味します。

こちらもご覧ください

于 2010-04-27T07:54:36.667 に答える
6

@polygenelubricants : しかし、一般的には、はい、静的なネストされた型は複数回インスタンス化できます。

その100%を確認するために、スニペットを拡張しました:

public class MultipleInner {
    static class Inner {
        private int state;
        public int getState() { return state; }
        public void setState(int state) { this.state = state; }
    }

    public static void main(String[] args) {
        List<Inner> inners = new ArrayList<Inner>();
        for (int i = 0; i < 100; i++) {
            Inner inner = new Inner();
            inner.setState(i);
            inners.add(inner);
        }
        for (Inner inner : inners) {
            System.out.println(inner.getState());
        }
    }
}

そしてもちろん、結果は次のとおりです。

0
1
2
3
.
.
.
97
98
99
于 2011-04-19T01:17:23.180 に答える
3

合法です。内部クラスが静的であるという事実は、ここで利点をもたらします。そのインスタンスは、それを含むクラスのインスタンスにバインドされていないため、自由にインスタンス化できます (アクセス修飾子で許可されている限り)。

ただし、その代償は、内部クラスが含まれているクラスの非静的メンバー/メソッドを使用できないことです。

于 2010-04-27T07:59:04.617 に答える
0

内部クラスは、クラスを含む非静的メンバー/メソッドを使用できます。囲んでいるクラスのオブジェクト参照を介してのみそれらを使用できます-

     public class MultipleInner {
      private int outerstate =10;
      static class Inner {
        private int state;
        public int getState() { return state; }
        public void setState(int state) { this.state = state; }
      }

     public static void main(String[] args) {       
        Inner inner = new Inner();
        inner.setState(new MultipleInner().outerstate);
        System.out.println(inner.getState());        
     }

}

したがって、内部クラスは、外側のクラスの非静的メンバーにアクセスできないという代償を支払う必要はありません。

于 2013-05-29T10:18:01.973 に答える
0

はい、何度でもインスタンスを作成できます。

おそらく、これが表示される理由は、プログラムが参照をどこかに保存することを考えていたためです。私はあなたに同意しますが、奇妙に思えます:S

于 2010-04-27T07:58:09.517 に答える