12

次のコードは、正当な前方参照の場合ですか? はいの場合、なぜですか?

public class MyClass
{
  private static int x = getValue();
  private static int y = 5;
  private static int getValue()
  {
    return y;
  }
  public static void main(String[] args)
  {
    System.out.println(x);
  }
}
4

2 に答える 2

19

あなたが持っている上記のコードは完全に正当な Java です。Java では、静的フィールドは次のように初期化されます。最初に、すべてのフィールドがそのタイプ (0、falseまたはnull) のデフォルトに設定され、次に宣言された順序で初期化されます。これは、上記のコードが次のことを行うことが保証されていることを意味します。

  1. s のデフォルト値であるため、xandをゼロに設定します。yint
  2. の値を読み取るxを呼び出して初期化します。まだ初期化されていないため、値は 0 のままです。getValue()yy
  3. 5 に初期化yします。

これは、xが値 0yを取り、値 5 を取ることを意味します。この動作は移植可能であり、保証されています。 これはここで見ることができます

お役に立てれば!

于 2012-04-05T20:58:49.190 に答える
5

コンパイルできるという事実によって、それが合法かどうかを判断できます。他のいくつかの言語とは異なり、Java には「未定義の動作」という概念がありません。ここで何が起こるかは完全に綴られています。直感に反するかもしれませんが、特に合法です。別の静的変数の初期化中に呼び出されたメソッドから初期化される前に、静的変数にアクセスできます。yのイニシャライザから直接アクセスする表面的に類似したケースx- すなわち、

private static int x = y;
private static int y = 5;

特に許可されていません。これには明確な理由はありません。

于 2012-04-05T21:00:34.290 に答える