Bar*_*end 70

根据定义,所有顶级类都是静态的.

什么static归结为是类的一个实例可以站在自己的.或者,反过来说:没有外部类的实例,非静态内部类(=实例内部类)不可能存在.由于顶级类没有外部类,因此它不能是任何东西static.

因为所有顶级类都是静态的,所以static在顶级类定义中使用关键字是没有意义的.

一些代码可以解决:

public class Foo {

    public class Bar {
         // Non-static innner class
    }

    public static class Baz {
         // Static inner class
    }
}

public class Example {
    public static void main(String[] args) {
        new Foo(); // this is ok
        new Foo.Baz(); // this is ok
        new Foo.Bar(); // does not compile!

        Foo f = new Foo();
        Foo.Bar bar = f.new Bar(); //this works, but don't do this
    }
}
Run Code Online (Sandbox Code Playgroud)

我把"但不要这样做"放在那里,因为它真的是丑陋的代码设计.实例内部类不应该在外部类外部可见.它们只能在外层使用.

  • +1:嵌套的`enum`实际上是`static`和`final`但是你也不能使用它们. (7认同)
  • @Barend 你能证明或提供一些关于“根据定义,所有顶级类都是静态的。”的参考吗?我正在尝试在线搜索,但找不到任何相关信息。因为接口是隐式公开的,所以你可以声明它或不声明它,这不会改变任何东西,至少编译器不会抱怨,但对于顶级类,你不能声明静态,这意味着它不是隐式静态的!那么是什么让你认为他们是?谢谢。 (4认同)
  • 这是非常不令人满意的答案,因为 (a) 没有官方文档/源代码参考。(b) 如果 `static` 毫无意义,那么添加它应该不会像在接口签名中添加 `public` 那样有问题。 (4认同)
  • @barend ..他们为什么编译器在我添加静态关键字时会抱怨 (3认同)
  • 该关键字没有任何价值,因此他们将其排除在外.我认为这是关于可读性的设计选择.当你在`interface`上定义一个方法时,你对`public`关键字有同样的看法(它就像没有意义一样),但在这种情况下,他们把它留在了. (2认同)
  • @Peter您实际上可以使用`static`。 (2认同)
  • “根据定义”是错误的;JLS 没有给出“静态”一词的任何总体定义,并且 JLS 中唯一描述为静态的内容是静态字段、静态方法、静态成员类型声明和静态初始值设定项。使用“静态”一词描述的唯一顶级声明是单静态导入声明和静态导入按需声明,但在这些情况下,“静态”指的是导入的名称,而不是导入声明本身。因此,JLS 中没有定义表明或暗示您所声称的内容是“根据定义”。 (2认同)
  • “毫无意义”并不是一个有效的解释。嵌套的“interface”或“enum”类型确实始终是“static”,但是,没有什么可以禁止您添加冗余的“无意义”“static”修饰符。 (2认同)

kay*_*ya3 7

简而言之,顶级类型声明不能是静态的,因为Java 语言规范(JLS) 并没有说它可以是。JLS明确表示static关键字作为顶级类的修饰符:

修饰符static仅适用于成员类(第 8.5.1 节),而不适用于顶级或本地或匿名类。

然而,接受的答案 - 有很多赞成 - 说这是因为顶级类“根据定义”是隐式静态的,所以static修饰符是不必要的。那是错的。

“静态”一词出现在 JLS 中的很多地方,但从未指代顶级类型声明。以下是可以是“静态”的内容的详尽列表:

JLS 中没有使用“静态”一词来指代顶级类型声明;因此,除了不是显式静态之外,根据定义,它们不是(也不能)“隐式”静态。