7

下面的代码只是简单地从使用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尚未初始化。为什么在这种情况下会发生这种情况?

4

4 回答 4

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);
    }
}
于 2013-04-22T23:33:32.043 回答
5

发生这种情况是因为您在初始化Test之前进行了初始化YEAR- 这意味着它将转到(隐式)构造函数并初始化evalYEAR-10之前YEAR的值(因此默认为 0)。

如评论中所述,只需在初始化中更改 YEAR 和 TEST 的顺序即可。

于 2013-04-22T23:49:36.720 回答
1

使eval静态,它会工作。如果您不希望它是静态的,则在 main 方法中进行计算。

于 2013-04-22T23:36:25.923 回答
1

正如其他人所提到的,问题出在静态字段的顺序上。但是,您可以通过使用方法延迟初始化来完全避免排序问题TEST(就像在单例模式中所做的那样):

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);
    }
}
于 2013-07-03T20:25:12.440 回答