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

2022-09-01 23:18:26

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

根据我基于静态类的理解,我们不能实例化静态类的对象。

但是,为什么在后续的静态环境中允许实例化静态嵌套类对象呢?

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

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

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()

答案 1

根据我基于静态类的理解,我们不能实例化静态类的对象。

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

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

也许您正在考虑C#中的静态类,它们是完全不同的?


答案 2

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

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

public class Test {

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

    class InnerClass {

    }
}  

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

无法访问 Test 类型的封闭实例。必须使用 Test 类型的封闭实例限定分配(例如 x.new A(),其中 x 是 Test 的实例)。

为避免这种情况,您可以实例化一个类型的对象,并从中创建一个实例:TestinnerClass

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

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

public class Test {

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

    static class InnerClass {

    }
}