Inner クラス自体が静的ではないためだと思います。Javaの観点からそれはインスタンス変数であり、私はそれを推測します(1)クラスローダは、潜在的な静的オブジェクトを見つけて初期化するために内部の非静的クラスにクロールするようには設計されていません。
しかし、それは不可能な問題ではありません。次の例を見てください。
public class Outer {
public static class Inner {
Outer owner;
static String constant;
{
constant = "foo";
}
private Inner(Outer owner) {
if (owner == null) {
throw new NullPointerException();
}
this.owner = owner;
}
}
public Inner newInner() {
return new Inner(this);
}
}
Inner
static と宣言されているため、警告さえありません。
Outer
しかし、よく見ると、これには外側のインスタンスへのポインターがありOuter
、プライベート コンストラクターしかないため作成することしかできず、その所有者を null にすることはできません。プログラマーの観点からは、非静的内部クラスのすべての制約があり、( のような特別なイディオムを除いてOuter.this
) 同じように使用できますが、コンパイラの観点からは静的であり、静的フィールドは正しくなります。最初のOuter
クラスの初期化で初期化されます。
(1) : Pacerier は、これが正しくない理由を以下のコメントで説明しています。