以下简单程序从系统中检索当前年份 (2011),然后简单地从当前年份中减去 1950。
package calculation;
import java.util.Calendar;
final public class Main
{
private static final Main INSTANCE = new Main();
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
private final int beltSize=CURRENT_YEAR - 1950;
private int beltSize()
{
return beltSize;
}
public static void main(String[] args)
{
Main main=new Main();
System.out.println("Wears a size " + main.beltSize() + " belt.");
System.out.println("Wears a size " + INSTANCE.beltSize() + " belt.");
}
}
上述代码中的以下语句返回正确的值。
Main main=new Main();
System.out.println("Wears a size " + main.beltSize() + " belt.");
它调用 beltSize() 方法,该方法正确返回 CURRENT_YEAR - 1950 的计算结果,即 61。
private static final Main INSTANCE = new Main();
System.out.println("Wears a size " + INSTANCE.beltSize() + " belt.");
上面的语句使用作为类成员的 static final 对象 INSTANCE 调用相同的方法 beltSize() 并错误地返回 -1950(负) 而不是正确的值 61。为什么?
最佳答案
静态变量的评估顺序很重要。所以改变顺序为
private static final int CURRENT_YEAR = Calendar.getInstance().get(Calendar.YEAR);
private static final Main INSTANCE = new Main(); // order of evaluation matters for static variables
由于 INSTANCE
在 CURRENT_YEAR 之前进行了计算,因此采用了 CURRENT_YEAR (0) 的默认值。
关于java - 在 Java 中调用静态对象的方法会评估一些不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8131780/