java - 在 Java 中调用静态对象的方法会评估一些不正确的值

标签 java

以下简单程序从系统中检索当前年份 (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/

相关文章:

java - 模拟resttemplate来测试作为restFul客户端的服务

java - AWS EBS快照,有没有办法知道EBS当前是否正在写入

java - 你能建议围绕 GSM AT 命令的 JAVA API 包装器吗?

java - 我在使用 Serialized 时犯了一个很大的错误。怎么修?

java - 生成具有一些限制的矩阵的所有可能配置

java - 如何让按钮永久不可点击

java - 如何在 Tomcat 中获取 org.apache.catalina.connector.Request 对象?

java - 在 Android 设备上使用 javascript 检测方向

java - 管理我的第一个项目

java - 打印机打印新行