1

我试图理解下面两行之间的区别。为什么当我向字段添加静态时它返回零。

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

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

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();

它会工作得很好。

或者,如果您删除static,this_year将在创建对象时被初始化theKing

于 2013-02-10T19:55:39.977 回答