JLSによると:-
8.1.3内部クラスとそれを囲むインスタンス
内部クラスは、明示的または暗黙的に静的として宣言されていないネストされたクラスです。内部クラスは静的初期化子(§8.7)またはメンバーインターフェースを宣言できません。内部クラスは、コンパイル時定数フィールド(§15.28)でない限り、静的メンバーを宣言できません。
内部クラスで使用されているが宣言されていないローカル変数、仮メソッドパラメータ、または例外ハンドラパラメータは、finalとして宣言する必要があります。内部クラスで使用されているが宣言されていないローカル変数は、内部クラスの本体の前に確実に割り当てる必要があります(§16)。
私が重要だと思ったこれらの2つのこととは別に、そこからそれを得ることができるものはもっとたくさんあります。、、、および..についての膨大な説明がありinner classesます。anonymous inner classesnested classes
更新された説明:-
考えてみてください。静的ブロックはクラスの初期化中に実行され、それを囲むクラスのインスタンスがないと、非静的内部クラスを初期化できません。これが理由です。
内部クラスは、囲んでいるクラスのに関連付けられています。それらは、囲んでいるクラスの他のインスタンス属性のようです。現在、コンテキストにフィールドinstanceを埋め込むことは意味がありません。ただし、コンパイル時として宣言した場合それらが許可される定数。staticnon-static
注:-static final Object = null コンパイル時定数ではありません..したがって、内部クラス内にそれらを含めることはできません
一方、内部クラスstaticが実際にはネストされたクラスである場合、フィールドは静的に宣言できます。これは、クラスに関連付けられたままなので、インスタンス化されたクラスを囲む前でもアクセスできます。
私はそれが理にかなっていることを願っています。
更新2:-
public class A {
class B {
static int x = 0;
}
}
上記のコードでstatic variable xは、はクラスBのすべてのインスタンスに共通です。また、の各インスタンスにはclass A独自のコピーがありますclass B(JVMはが作成されるたびにクラスBをロードする必要があるためinstance of A)。
したがって、コンパイル時定数でない限り、static variable xのすべてのインスタンス間で共有することはできませんでした。クラスAの各インスタンス。したがって、クラスAのインスタンスごとに異なります。したがって、静的変数は、クラスAの異なるインスタンス間で実際には共有されません。静的変数には意味がありません。)class AB.xB.xx
私は今、それが理にかなっていることを願っています。