22

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

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

但是为什么在以下情况下允许实例化静态嵌套类对象?

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

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

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()
4

3 回答 3

29

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

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

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

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

于 2012-10-11T09:37:28.730 回答
2

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

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

public class Test {

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

    class InnerClass {

    }
}  

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

没有可访问类型 Test 的封闭实例。必须使用 Test 类型的封闭实例来限定分配(例如 xnew A(),其中 x 是 Test 的实例)。

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

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 {

    }
}
于 2017-03-22T11:30:43.007 回答
0

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

于 2012-10-11T09:37:02.463 回答