以下代码只是从使用java.util.Calendar
类获得的当前年份中减去一个值(在本例中为10,仅用于演示)。
public final class Test
{
private static final Test TEST = new Test();
private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR);
private final int eval=YEAR - 10;
public static void main(String[] args)
{
System.out.println("Evaluation "+TEST.eval);
}
}
我希望此代码显示2003(当前年份 - 10),而是显示-10
。我假设常量YEAR
尚未初始化。为什么在这种情况下会发生这种情况?
答案 0 :(得分:5)
因为它不是static
- 你必须创建一个对象才能使用这个字段! (或将其更改为静态)
尝试:
public final class Test
{
private static final Test TEST = new Test();
private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR);
private final int eval=YEAR - 10;
public static void main(String[] args)
{
Test t = new Test();
System.out.println("Evaluation "+t.eval);
}
}
答案 1 :(得分:5)
这是因为您在初始化Test
之前初始化YEAR
- 这意味着它将转到(隐式)构造函数并在eval
之前初始化YEAR-10
YEAR
1}}有一个值(所以它默认为0)。
如评论中所述,只需在初始化中更改YEAR和TEST的顺序即可。
答案 2 :(得分:1)
让eval
静态,它会起作用。如果您不希望它是静态的,那么在main方法中进行计算。
答案 3 :(得分:1)
正如其他人所提到的,问题在于静态字段的顺序。但是,您可以通过使用方法懒惰地初始化TEST
来避免排序问题(就像在singleton pattern中完成的那样):
public final class Test
{
private static Test TEST = null;
private static final Test getInstance() {
if (TEST == null) {
TEST = new Test();
}
return TEST;
}
private static final int YEAR = Calendar.getInstance().get(Calendar.YEAR);
private final int eval=YEAR - 10;
public static void main(String[] args)
{
System.out.println("Evaluation "+Test.getInstance().eval);
}
}