0

次のクラスを仮定します

class A{
  public final static int num = 7;
  public final static A instance = new A();
  private A(){}
}

class TestA{
  public static void main(String args[]){
     System.out.print(A.num);
  }
}

このシナリオではnuminstanceいつ初期化され、いつクラス A が JVM にロードされますか? JVMは初期化時にクラスをロードすることを理解していましたが、間違っている場合は修正してください。クラス A にはプライベート コンストラクターがあるため、外部で初期化することはできません。

前もって感謝します。

4

7 に答える 7

1

num と instance はクラスの静的データです。静的とは、クラスのすべてのインスタンス間で何かが共有されることを意味します。また、クラスが JVM にロードされるたびに、すべての静的データがロードされます。静的データにアクセスするためにインスタンスの作成を待つ必要はありません。あなたのケースでは、クラスnumを実行するとすぐにインスタンスが実行時にJVMにロードされます。

よろしく

于 2013-07-27T16:06:17.303 に答える
1

これを行う標準 Java クラスの例は、java.lang.Mathです。

これはユーティリティ クラスであり、インスタンス化を意図していないため、コンストラクターは非公開ですが、E、PI などの定数が含まれています。

于 2013-07-27T16:17:38.467 に答える
1

変数は、クラスがクラス ローダーによって最初にロードされるときに初期化されます。これは通常、静的に、またはいくつかのオブジェクトをインスタンス化することによってクラスを最初に使用するときです。インポートは、クラスの使用としてカウントされません。クラスで実際に何かを行うまで、これらはコンパイラによって無視されます。

クラスの静的初期化子ブロックを使用して、初期化をカスタマイズできます。これは、クラスがロードされたときと最初のコンストラクター呼び出しの前に実行されることを除いて、コンストラクターと非常によく似た働きをします。

class Foo {
  public static final String FOO;

  {
    FOO="helloworld";
  }
}
于 2013-09-10T09:22:41.953 に答える
1

実際、使用A.numするとまったく初期化されません。これは、コンパイルが定数を置き換え、どこでもA.num使用されているため、コンパイラーが7代わりに配置するためです。

これを確認するには、コンパイル済みのクラスを逆コンパイルします。

ただし、クラスローダーによってロードされるA.instanceと初期化されます。A

于 2013-07-27T16:01:53.663 に答える
1

クラスのロード時に実行されます。クラスは、それが構築されるか、その静的変数/メソッドがアクセスされるたびにロードされます。

于 2013-07-27T15:58:48.593 に答える
1

クラスがロードされると、クラスに属しているため、静的ブロックと静的変数が初期化されます。

于 2013-07-27T15:59:42.923 に答える
1

オブジェクトA.instanceはコードで使用される最初の参照で初期化され、クラスAはロードされる別のクラスの依存関係として見つかったときに初期化されます

于 2013-07-27T15:59:50.327 に答える