静态嵌套类可以多次实例化吗?

sto*_*986 22 java static nested-class

鉴于我所知道的其他类型的静态编程功能 - 我认为答案是'不'.然而,看到这样的陈述OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();让我感到奇怪.

pol*_*nts 31

是的,static嵌套类型的语义中没有任何内容可以阻止您这样做.这个片段运行正常.

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

也可以看看


现在,嵌套类型当然可以进行自己的实例控制(例如private构造函数,单例模式等),但这与嵌套类型无关.另外,如果嵌套类型是a static enum,当然你根本无法实例化它.

但总的来说,是的,static嵌套类型可以多次实例化.

请注意,从技术上讲,static嵌套类型不是"内部"类型.

JLS 8.1.3内部类和封闭实例

一个内部类是没有明确或隐含声明嵌套类static.

也就是说,根据JLS术语,内部类是不是static.如果是static,那么它只是一个嵌套类型.


static意味着什么?

static 简单地说,嵌套类型不需要实例化封闭类型的实例.

也可以看看

  • 谢谢!当我第一次想到它时,正如我在对我的问题的评论中所描述的那样,我的想法是"尽管存在封闭的上下文实例,但静态是单一的".现在,当我仔细考虑你对'static'的定义时,我正在重新定义我对该术语的理解是"无论是什么是静态存在而独立于封闭上下文的实例" - 因此,静态嵌套类存在于一个实例之外这是父类.我相信这种理解将适用于循环变量,函数变量和类成员的上下文中的静态. (2认同)

Fil*_*ale 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然结果是:

0
1
2
3
.
.
.
97
98
99
Run Code Online (Sandbox Code Playgroud)