Java日历年初始化为静态int时返回零

Java日历年初始化为静态int时返回零,java,Java,我试图理解下面两行之间的区别。为什么我在字段中添加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 能解释为什么第一个返回零的人 下面是我使

我试图理解下面两行之间的区别。为什么我在字段中添加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.");
  }
}

因此,上面将首先初始化
theKing
,它调用构造函数,构造函数使用今年
的未初始化值0
。如果要将其更改为:

private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);
public static final TheKing theKing = new TheKing();
它会很好用的

或者,如果删除
静态
今年
将在对象
国王
创建时初始化。

因此,上面将首先初始化
theKing
,它调用构造函数,构造函数使用今年
的未初始化值0
。如果要将其更改为:

private static final int this_year = Calendar.getInstance().get(Calendar.YEAR);
public static final TheKing theKing = new TheKing();
它会很好用的


或者,如果您删除
静态
,今年的
将在对象
国王
创建时进行初始化。

当字段声明为
静态
时,它们将在静态初始化方法中进行初始化,这意味着您的代码在编译时如下所示:

static {
    theKing = new TheKing();
    this_year = Calendar.getInstance().get(Calendar.YEAR);
}
请注意,在初始化
this\u year
之前调用构造函数,在初始化
int
之前,构造函数的默认值为
0
。换句话说,
本年度在设置为
2013
之前使用

解决此问题的一种方法是简单地颠倒声明的顺序:

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

当字段声明为静态时,它们将在静态初始化方法中初始化,这意味着您的代码在编译时如下所示:

static {
    theKing = new TheKing();
    this_year = Calendar.getInstance().get(Calendar.YEAR);
}
请注意,在初始化
this\u year
之前调用构造函数,在初始化
int
之前,构造函数的默认值为
0
。换句话说,
本年度在设置为
2013
之前使用

解决此问题的一种方法是简单地颠倒声明的顺序:

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

两个代码块看起来相同。请整理您的代码,以了解您的问题。
this_year=2013
在这两种情况下对我来说都是如此。您如何在其他地方使用这些值?除了@Vulcan之外的其他结果。到目前为止,如果使用static、2013和all OK,当我打印时,非静态会导致异常“从静态上下文引用非静态变量”。我有Java版本“1.7.0_13”,两个代码块看起来都一样。请整理您的代码,以了解您的问题。
this_year=2013
在这两种情况下对我来说都是如此。您如何在其他地方使用这些值?除了@Vulcan之外的其他结果。到目前为止,如果使用静态、2013和所有OK,则在打印时,非静态会导致异常“从静态上下文引用非静态变量”。我有Java版本“1.7.0_13”