簡體   English   中英

靜態嵌套類可以多次實例化嗎?

[英]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();
        }
    }
}

也可以看看


現在,嵌套類型當然可以進行自己的實例控制(例如private構造函數,單例模式等),但這與嵌套類型無關。 此外,如果嵌套類型是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

靜態嵌套類確實是實例化的 - 如上所述,它們是位於“外部”類的命名空間中的頂級類,並遵循關於“外部”類的引用的靜態語義。 此代碼示例演示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM