两次调用方法的静态赋值

时间:2016-10-23 07:13:24

标签: 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
}

输出:

Loading value...
Loading value...

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

2 个答案:

答案 0 :(得分:7)

让我们逐步介绍几个关键行。

这一行:

private static Integer value1 = getValue();

打印"装载价值......"并将flag设置为非空值。

然后这一行:

private static Integer flag = null;

flag 设置回null

然后这一行:

private static Integer value2 = getValue();

打印"装载价值......"再次将flag再次设置为非空值。

然后main运行,这一行:

getValue();

不会打印任何内容,因为flag设置为非空值。

答案 1 :(得分:-2)

这是个好问题。类加载器遵循一些规则来加载类,首先加载静态语句并为堆内存中的类区域创建内存。