enum Test {
e1,e2;
int i=0;
static int j=5;
Test(){
System.out.println(i+" "+j);
}
}
上記のコードでは、コンストラクターはインスタンス変数にアクセスできますが、静的変数 J にはアクセスできません。
私は他の著者に関連する答えを読みましたが、すべてがJ(静的フィールド)の初期化の前にe1とe2が初期化されたと言っていますが、Java仕様によれば、クラスがメモリにロードされたときにすべての静的フィールドが初期化されました。コンストラクタ。したがって、Test() コンストラクターを実行する前に、静的変数 j を初期化する必要があります。私は制限を理解することができません.どんな体でも私に理解させることができます.私はすでに列挙型のコンストラクターが静的フィールドにアクセスできないのはなぜですか? しかし、私は次のような答えには満足していません:-静的フィールドがすべて初期化される前にコンストラクターが呼び出されます。
enum のような単純なクラスを使用した別の例を考えてみましょう
class Test{
public static final Test t=new Test();
static int a=5;
Test(){
System.out.println(a);
}
public static void main(String[] args) {
}
}
ここでは、コンストラクターは static フィールドの初期化の前に実行され、print 0 としても実行されます (JVM が初期化を行ったように)。しかし、コンパイル エラーや実行時の問題はありません。次に、同じことが列挙型で起こらないのはなぜですか。