以静态方式创建对象

2022-08-31 14:33:33

谁能解释一下Java是如何执行这段代码的?我的意思是执行每个语句的顺序。

public class Foo
{
    boolean flag = sFlag;
    static Foo foo = new Foo();
    static boolean sFlag = true;

    public static void main(String[] args)
    {
        System.out.println(foo.flag);
    }
}

输出:

false

答案 1
  • 类初始化开始。最初,为空且为假foosFlag
  • 第一个静态变量初始值设定项 () 运行:foo
    • 已创建 的新实例Foo
    • 执行 的实例变量初始值设定项 - 当前为 false,因此 的值为 falseflagsFlagflag
  • 执行第二个静态变量初始值设定项 (),将值设置为 truesFlag
  • 类初始化完成
  • main运行, 打印出来 ,这是假的foo.flag

请注意,如果将其声明为,它将被视为编译时常量,此时对它的所有引用基本上都将内联到 ,因此也为 true。sFlagfinaltruefoo.flag


答案 2

foo在类的静态初始化期间和初始化 sFlag 之前实例化,并且布尔值的默认值为 false。

  1. 类已加载
  2. Foo 初始化为实例

    2.a 实例成员标志初始化为 sFlag 值(默认)false

  3. sFlag 已初始化为 true

有关详细信息,请参阅 JLS §12.4


推荐