静态嵌套类和非静态嵌套类的区别是什么?


当前回答

讨论嵌套类……

不同之处在于,同样是静态的嵌套类声明可以在外围类之外实例化。

当你有一个非静态的嵌套类声明时,Java不允许你实例化它,除非通过外围类。从内部类创建的对象被链接到从外部类创建的对象,因此内部类可以引用外部类的字段。

但如果它是静态的,则链接不存在,外部字段不能被访问(除非通过像任何其他对象一样的普通引用),因此您可以通过自身实例化嵌套类。

其他回答

让我们看看Joshua Bloch的《Effective Java》:

从技术上讲,没有静态内部类这样的东西。根据Effective Java,正确的术语是静态嵌套类。非静态嵌套类实际上是一个内部类,与匿名类和局部类一样。

现在引用一下:

非静态嵌套类的每个实例都隐式关联 使用其包含类的封闭实例…这是可能的 调用封闭实例上的方法。

静态嵌套类不能访问外围实例。它也占用更少的空间。

Static inner class cannot access non-static members of enclosing class. It can directly access static members (instance field and methods) of enclosing class same like the procedural style of getting value without creating object. Static inner class can declare both static and non-static members. The static methods have access to static members of main class. However, it cannot access non-static inner class members. To access members of non-static inner class, it has to create object of non-static inner class. Non-static inner class cannot declare static field and static methods. It has to be declared in either static or top level types. You will get this error on doing so saying "static fields only be declared in static or top level types". Non-static inner class can access both static and non-static members of enclosing class in procedural style of getting value, but it cannot access members of static inner class. The enclosing class cannot access members of inner classes until it creates an object of inner classes. IF main class in accessing members of non-static class it can create object of non-static inner class. If main class in accessing members of static inner class it has two cases: Case 1: For static members, it can use class name of static inner class Case 2: For non-static members, it can create instance of static inner class.

内部类不能是静态的,所以我将把你的问题重新定义为“静态嵌套类和非静态嵌套类之间的区别是什么?”

正如你在这里所说的,内部阶级不可能是静态的…我发现下面的代码是静态....原因?或者哪个是正确的....

是的,静态嵌套类型的语义中没有任何东西会阻止您这样做。这段代码运行正常。

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

这是这个网站上的一个代码…

对于问题——>静态嵌套类可以实例化多次吗?

答案是——>

现在,当然嵌套类型可以做自己的实例控制(例如,私有构造函数,单例模式等),但这与它是嵌套类型的事实无关。此外,如果嵌套类型是静态enum,当然您根本不能实例化它。

但是一般来说,静态嵌套类型可以被实例化多次。

注意,从技术上讲,静态嵌套类型不是“内部”类型。

讨论嵌套类……

不同之处在于,同样是静态的嵌套类声明可以在外围类之外实例化。

当你有一个非静态的嵌套类声明时,Java不允许你实例化它,除非通过外围类。从内部类创建的对象被链接到从外部类创建的对象,因此内部类可以引用外部类的字段。

但如果它是静态的,则链接不存在,外部字段不能被访问(除非通过像任何其他对象一样的普通引用),因此您可以通过自身实例化嵌套类。

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。