静态成员未按预期初始化

时间:2013-04-22 23:29:57

标签: java static static-members

以下代码只是从使用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 个答案:

答案 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);
    }
}