2

静的フィールドのみを持ち、コンストラクターを持たないJava クラスを考えてみましょう。

public class OnlyStatic {
   static O1 o1 = new o1();
   static O2 o2 = new o2();

   public static int compute(int whatever) {
       return o1.foo+o2.bar+whatever;
   }
}

別のクラスでは、次のcomputeいずれかによってメソッドが使用されstatic importます。

static import OnlyStatic.compute
int a = OnlyStatic.compute(3);

または直接、呼び出し元が同じパッケージにあると仮定します。

int a = OnlyStatic.compute(3);

o1 と o2 はいつ初期化されますか? インポート時、またはcompute()初めて呼び出されるのはいつですか?

4

1 に答える 1

5

オブジェクトo1とは、それらを作成せずにコンテキストでo2使用することはできません。staticstatic

JVMSは次のように述べています

クラスで宣言された静的初期化子は、クラスが初期化されるときに実行されます

さらに遠く

クラスまたはインターフェイスタイプTは、次のいずれかが最初に発生する直前に初期化されます。

  • Tはクラスであり、Tのインスタンスが作成されます。
  • Tはクラスであり、Tによって宣言された静的メソッドが呼び出されます。
  • Tによって宣言された静的フィールドが割り当てられます。
  • Tによって宣言された静的フィールドが使用され、フィールドは定数変数ではありません(§4.12.4)。
  • Tは最上位クラスであり、 T内に字句的にネストされたassertステートメント(§14.10)が実行されます。

したがって、あなたの場合、静的メソッドcompute()が最初に実行されるとき。

于 2012-02-20T13:02:31.547 に答える