1

以下の2行の違いを理解しようとしています。フィールドに static を追加するとゼロが返されるのはなぜですか。

private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);

これから私は得る:this_year = 0;

private final int this_year = Calendar.getInstance().get(Calendar.YEAR);

そしてこれから私は得る:this_year = 2013;

最初がゼロを返す理由を説明できる人はいますか?

これを使用するコードは次のとおりです。

public class TheKing {
  public static final TheKing theKing = new TheKing();
  private final int beltSize;
  private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);

  private TheKing() { 
    beltSize = this_year - 1930;
  }

  public int beltSize() {
    return beltSize;
  }

  public static void main(String[] args) {
    System.out.println("TheKing wears a size " + 
      theKing.beltSize() + " belt.");
  }
}
4

2 に答える 2

3

フィールドが宣言さstaticれると、静的初期化メソッドで初期化されます。つまり、コンパイルすると、コードは次のようになります。

static {
    theKing = new TheKing();
    this_year = Calendar.getInstance().get(Calendar.YEAR);
}

this_yearコンストラクターは、初期化される前に呼び出され、初期化される前intに、デフォルト値が。であることに注意してください0。つまり、this_yearはに設定される前に使用され2013ます。

これを修正する1つの方法は、宣言の順序を単純に逆にすることです。

private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);
public static final TheKing theKing = new TheKing();
于 2013-02-10T19:57:05.190 に答える
1

静的メソッドは、コードで指定された順序で初期化されます

public static final TheKing theKing = new TheKing();
private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);

したがって、上記はtheKing最初に初期化され、コンストラクターを呼び出します。コンストラクターは、の初期化されていない値0を使用しますthis_year。次のように変更する場合:

private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);
public static final TheKing theKing = new TheKing();

それはうまくいくでしょう。

または、を削除するとstaticthis_yearオブジェクトのtheKing作成時にが初期化されます。

于 2013-02-10T19:55:39.977 に答える