为什么允许实例化静态嵌套类对象?

我已经开始学习用于Android应用程序开发的Java语言。

根据我对静态类的理解,我们无法实例化静态类的对象。

但是为什么静态嵌套类对象的实例化允许在后面的situaltion?

class EnclosingClass { //... class static StaticInnerClass { //... } } 

为什么我们可以创建内部类的对象,如果它被标记为静态?

 EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass() 

根据我对静态类的理解,我们无法实例化静态类的对象。

您对“静态类”含义的理解是不正确的。 基本上, Java中的“静态类”是一个嵌套类,它没有对包含类的实例的隐式引用。 有关更多信息,请参阅JLS的8.5.1节 ,特别是:

static关键字可以修改非内部类或接口T的主体内的成员类型C的声明。其效果是声明C不是内部类。 正如T的静态方法在其体内没有T的当前实例一样,C也没有T的当前实例,也没有任何词法封闭实例。

也许你在想C#中的静态类,它们完全不同?

根据oracle文档

与类方法和变量一样,静态嵌套类与其外部类相关联。 和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 – 它只能通过对象引用来使用它们。

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

使用封闭的类名访问静态嵌套类:

 OuterClass.StaticNestedClass 

例如,要为静态嵌套类创建对象,请使用以下语法:

 OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass(); 

为什么我们可以创建内部类的对象,如果它被标记为静态?

您可能需要在static上下文中使用nested class ,例如:

 public class Test { public static void main(String args[]) { InnerClass innerClass = new InnerClass(); } class InnerClass { } } 

在这种情况下, 当您尝试实例化innerClass您会收到错误:

不能访问类型为Test的封闭实例。 必须使用Test类型的封闭实例限定分配(例如,xx是A(),其中x是Test的实例)。

为避免这种情况,您可以实例化Test类型的对象并innerClass创建innerClass的实例:

 Test test = new Test(); InnerClass innerClass = test.new InnerClass(); 

或者更好,将innerClass声明为static并在静态上下文中实例化它:

 public class Test { public static void main(String args[]) { InnerClass innerClass = new InnerClass(); } static class InnerClass { } } 

检查它,也许它可以帮助你嵌套类