【问题标题】:Why instantiation of static nested class object is allowed?为什么允许实例化静态嵌套类对象?
【发布时间】:2012-10-01 22:29:48
【问题描述】:

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

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

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

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

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

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()

【问题讨论】:

  • 这是来自文档的一个很好的引用:“嵌套类分为两类:静态和非静态。声明为静态的嵌套类简称为静态嵌套类。非静态嵌套类称为内部类。” (Link)。如果你向下滚动,他们会解释它们的用法。
  • @ParagMeshram 你对你的赏金有什么期望? Jon Skeet 的回答不清楚吗?
  • 来自文档 (docs.oracle.com/javase/tutorial/java/javaOO/nested.html) 的另一个清晰而有用的引述是:“实际上,静态嵌套类在行为上是一个顶级类,它嵌套在另一个顶级类中包装方便。”

标签: java oop inner-classes nested-class


【解决方案1】:

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

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

public class Test {

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

    class InnerClass {

    }
}  

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

没有可访问类型 Test 的封闭实例。必须符合条件 使用 Test 类型的封闭实例进行分配(例如 x.new 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 {

    }
}

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你不是说静态的inner类吗?
    • @Keyser:不,我的意思是一个 嵌套 类。请参阅 JLS 的引用:静态类表明该类不是内部类。来自 JLS 的第 8.1.3 节:“内部类是没有显式或隐式声明为静态的嵌套类。”
    • @SamusArin:没有所谓的“非嵌套静态类”。
    • @JonSkeet 好的,这些天我一直在用 C# 编程,所以这是我的问题,b/c 它确实有它们。非常感谢!
    • @SamusArin:对——C# 的静态类和 Java 的嵌套静态类完全不同。 Java 没有 C# 的静态类,C# 也没有 Java 的内部类。 (如果您想引用 C# 中包含类的实例,则需要使其显式。)
    【解决方案3】:

    检查一下,也许它可以帮助你 Nested Classes

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      相关资源
      最近更新 更多