1. ホーム
  2. java

[解決済み] なぜJavaは内部クラスでの静的フィールドを禁止しているのですか?

2023-04-04 22:41:09

疑問点

class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 

静的フィールドにアクセスすることはできませんが OuterClass.InnerClass.i でアクセスすることはできませんが、例えばInnerClassオブジェクトの生成数など、静的であるべきものを記録したい場合、そのフィールドを静的にすることができれば便利です。そこで なぜ は内部クラスでの静的フィールド/メソッドを禁止しているのでしょうか?

EDIT: 静的ネストされたクラス(または静的インナークラス)でコンパイラを幸せにする方法は知っていますが、私が知りたいのは、なぜJavaは言語設計と実装の両方の側面からインナークラス(または通常のインナークラス)内の静的フィールド/メソッドを禁止しているのか、誰かがそれについてもっと知っているならばです。

どのように解決するのですか?

内部クラスの背後にある考え方は、包含するインスタンスのコンテキストで操作することです。静的変数とメソッドを許可することは、どういうわけかこの動機と矛盾するのでしょうか?

8.1.2 内部クラスと包含するインスタンス

内部クラスは、明示的または暗黙的に静的宣言されていないネストされたクラスです。内部クラスは、静的イニシャライザ (§8.7) やメンバインタフェースを宣言してはいけません。内部クラスは、コンパイル時定数フィールド (15.28節) でない限り、静的メンバを宣言してはいけません。