静态赋值调用该方法两次

man*_*nta 2 java static

嗯......我无法为这个问题想出更好的头衔

我无法理解为什么调用静态方法并将其值赋给另一个静态成员调用该方法getValue()两次.

如果我在main方法之后移动静态赋值,则它不会加载两次.我知道这是愚蠢的,但我错过了一些明显的东西吗?

public class Test {
    private static Integer value1 = getValue(); // This is causing to load again

    private static Integer flag = null;

    public static Integer getValue() {
        if (flag != null) { // if flag is loaded already, return it.
            return flag;
        }

        System.out.println("Loading value...");

        flag = Integer.valueOf(10);

        return flag;
    }

    public static void main(String[] args) {
        getValue();
    }

    private static Integer value2 = getValue(); // This will not cause to load again
}
Run Code Online (Sandbox Code Playgroud)

输出:

Loading value...
Loading value...
Run Code Online (Sandbox Code Playgroud)

在线测试:https://ideone.com/pgRbff

use*_*ica 7

让我们逐步介绍几个关键线.

这一行:

private static Integer value1 = getValue();
Run Code Online (Sandbox Code Playgroud)

打印"正在加载值..."并设置flag为非空值.

那么这一行:

private static Integer flag = null;
Run Code Online (Sandbox Code Playgroud)

设置flag null.

那么这一行:

private static Integer value2 = getValue();
Run Code Online (Sandbox Code Playgroud)

再次打印"加载值..."并再次设置flag为非空值.

然后main运行,这一行:

getValue();
Run Code Online (Sandbox Code Playgroud)

不打印任何内容,因为flag设置为非null值.