为什么允许实例化静态嵌套类对象?
我已经开始学习用于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 { } }
检查它,也许它可以帮助你嵌套类