为什么Java禁止在内部类中使用静态字段?

91
class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 
尽管无法使用OuterClass.InnerClass.i访问静态字段,但如果我想记录应该是静态的东西,比如创建的InnerClass对象数量,将该字段设置为静态将会很有帮助。那么,为什么Java禁止在内部类中使用静态字段/方法呢?
编辑:我知道如何使用静态嵌套类(或静态内部类)使编译器满意,但我想知道的是,如果有人对语言设计和实现方面更了解,为什么Java禁止在内部类(或普通内部类)中使用静态字段/方法。

3
我最喜欢的例子是为内部类设置一个专门的Logger。它不能是静态的,因为所有其他Loggers都是这样的。 - Piotr Findeisen
8
自Java 16版本以后,since不再适用 - 请参阅此答案 - Nicolai Parlog
12个回答

0

Java语言设计师自己的话中:

自从嵌套类首次引入Java以来,内部声明的嵌套类被禁止声明静态成员... 这简化了语言解析和验证作用域内变量、方法等引用的任务。

从未有过特别宏伟的概念或哲学原因来禁止此操作。

为了简化语言的工作,认为继续维护此限制不够理由。在Java 16引入记录的同时,他们决定放宽这一限制。


-1
我猜这是为了保持一致性。虽然似乎没有任何技术限制,但你无法从外部访问内部类的静态成员,即OuterClass.InnerClass.i,因为中间步骤不是静态的。

但是内部类可以拥有 static final 常量。 - VimNing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接