静态成员未按预期初始化

Tin*_*iny 7 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这段代码显示2003(当前年份 - 10),但显示它-10.我假设常量YEAR尚未初始化.为什么会发生这种情况?

alf*_*sin 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


ddm*_*mps 5

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

如注释中所述,只需在初始化中更改YEAR和TEST的顺序即可.