プログラミングの他のすべてのタイプの静的機能について私が知っていることを考えると、答えは「いいえ」だと思います。しかし、次のようなステートメントを見ると、OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
不思議に思います。
6 に答える
はい、static
ネストされた型のセマンティクスには、それを止めるものは何もありません。このスニペットは問題なく動作します。
public class MultipleNested {
static class Nested {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Nested();
}
}
}
こちらもご覧ください
public static interface Map.Entry<K,V>
public static class AbstractMap.SimpleEntry<K,V>
- おそらく最もよく知られている入れ子型です。明らかに複数回インスタンス化されています。
もちろん、ネストされた型は独自のインスタンス コントロール (private
コンストラクタ、シングルトン パターンなど) を実行できますが、それはネストされた型であるという事実とは関係ありません。また、ネストされた型が a のstatic enum
場合、もちろんインスタンス化することはできません。
しかし、一般に、static
ネストされた型は複数回インスタンス化できます。
static
技術的には、ネストされた型は「内部」型ではないことに注意してください。
JLS 8.1.3 内部クラスとそれを囲むインスタンス
内部クラスは、明示的または暗黙的に宣言されていないネストされたクラスです
static
。
つまり、JLS の用語によれば、内部クラスはそうではないクラスですstatic
。の場合static
、それは単なるネストされた型です。
では、どういうstatic
意味ですか?
static
単純に、入れ子になった型は、囲んでいる型のインスタンスをインスタンス化する必要がないことを意味します。
こちらもご覧ください
@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
合法です。内部クラスが静的であるという事実は、ここで利点をもたらします。そのインスタンスは、それを含むクラスのインスタンスにバインドされていないため、自由にインスタンス化できます (アクセス修飾子で許可されている限り)。
ただし、その代償は、内部クラスが含まれているクラスの非静的メンバー/メソッドを使用できないことです。
内部クラスは、クラスを含む非静的メンバー/メソッドを使用できます。囲んでいるクラスのオブジェクト参照を介してのみそれらを使用できます-
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());
}
}
したがって、内部クラスは、外側のクラスの非静的メンバーにアクセスできないという代償を支払う必要はありません。
はい、何度でもインスタンスを作成できます。
おそらく、これが表示される理由は、プログラムが参照をどこかに保存することを考えていたためです。私はあなたに同意しますが、奇妙に思えます:S