JLS 15.9.2は、囲んでいるインスタンスを決定する方法を教えてくれます。インスタンス化されるクラスを C とし、作成されるインスタンスを i とします。
C が内部クラスの場合、i は次のように決定される、すぐに囲んでいるインスタンス (§8.1.3) を持つことができます。
[...]
C がローカル クラスの場合、次のようになります。
C が静的コンテキストで発生する場合、 i にはすぐに囲んでいるインスタンスはありません。
それ以外の場合、クラス インスタンス作成式が 静的コンテキストで発生すると、コンパイル時エラーが発生します。
それ以外の場合は、O を C のすぐ外側のクラスとします。n を整数とし、O が、クラス インスタンス作成式が現れるクラスの n 番目の語彙的に外側を囲む型宣言になるようにします。
i のすぐ外側のインスタンスは、this の n 番目の字句的に外側のインスタンスです。
太字のケースの意味がわかりませんでした。コンパイルされるべきではなかった例を挙げましょう。
class A{
int a;
public static void main (String[] args) throws java.lang.Exception{
class Foo{
void bar(){
}
}
Foo f = new Foo(); //Instance creation expression occured in the static context
}
}
それの何がいけないの?2番目のポイントを説明する実際の例を提供できませんか?