static コンテキストについて

JLS2 8.1.2 より。static コンテキスト内で定義された内部クラスは外側のクラスへの参照を持たないので、例えば外側のクラスのインスタンス変数などへはアクセスできない。

class StaticContext {
     // static コンテキストではない
    Object o1 = new Object() { };
    // クラス変数の初期化子は static コンテキスト
    static Object o2 = new Object() { };

    StaticContext(Object obj) {
        // static コンテキストではない
        class Inner1 {
        }
    }

    static {
        // クラス初期化子の中は static コンテキスト
        class Inner2 {
        }
    }

    {
        // static コンテキストではない
        class Inner3 {
        }
    }
}

class StaticContextChild extends StaticContext{
    StaticContextChild() {
        // super() や this() 呼び出しの引数は static コンテキスト。
        // まだこのオブジェクトは初期化されてないから。
        // こんなのいちいち覚えている人はいるのだろうか……。
        super(new Object() { });
    }
}