[英]Can a Static Nested Class be Instantiated Multiple Times?
鑒於我所知道的其他類型的靜態編程功能 - 我認為答案是'不'。 但是,看到像OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
這樣的語句OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
我好疑惑。
是的, 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
構造函數,單例模式等),但這與嵌套類型無關。 此外,如果嵌套類型是static enum
,當然您根本無法實例化它。
但總的來說,是的, static
嵌套類型可以多次實例化。
請注意,從技術上講, static
嵌套類型不是“內部”類型。
內部類是未顯式或隱式聲明為
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
靜態嵌套類確實是實例化的 - 如上所述,它們是位於“外部”類的命名空間中的頂級類,並遵循關於“外部”類的引用的靜態語義。 此代碼示例演示:
public class OuterClass {
String outerStr = "this is the outer class!!" ;
public static class StaticNestedClass {
String innerStr = "default / first instance" ;
}
public static void main(String[] args) {
OuterClass.StaticNestedClass nestedObject1 = new OuterClass.StaticNestedClass();
OuterClass.StaticNestedClass nestedObject2 = new OuterClass.StaticNestedClass();
nestedObject2.innerStr = "second instance" ;
System.out.println(nestedObject1.innerStr) ;
System.out.println(nestedObject2.innerStr) ;
}
}
output:
default / first instance
second instance
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.