为什么内部类不能声明静态成员?

Dmi*_*kov 21 java inner-classes

Java Tutorial说,由于内部类与封闭类的实例相关联,因此它(内部类)不能定义任何静态成员本身.

对我来说有趣的是为什么内部类不能声明静态成员,例如,某个private static字段,这个内部类的实例可能与同一内部类的其他实例共享?这只是Java中的一个实现,必须被视为理所当然或其他什么?

jta*_*orn 6

基本上只是一个武断的决定.我们没有理由也不可能得到支持,但还算不上什么好的理由支持它.只是声明外部类中的静态字段.

另外,这个引用可能不完全正确:我相信你可以在内部类中声明一个静态的serialVersionUID.

  • 是的,这是一个编译器限制,而不是JVM中固有的东西.内部类是一个主要的kluge,并且在JVM级别上内部和外部之间实际上没有区别. (2认同)
  • 是不是"把你的变量放在逻辑上拥有它的类中"是支持它的一个很好的理由? (2认同)

Mic*_*rdt 5

因为Java 语言规范是这样说的

内部类是未显式或隐式声明为静态的嵌套类。内部类不能声明静态初始值设定项(第 8.7 节)或成员接口。内部类不能声明静态成员,除非它们是编译时常量字段(第 15.28 节)。

至于为什么这样指定,我不知道。我的猜测是内部类被设计为小型辅助类,其复杂性应该非常有限。

  • @pst:如果您访问规范的链接,您会发现它明确指出“根据 Java 编程语言的通常规则,不是内部类的嵌套类可以自由声明静态成员。” (2认同)