以静态方式创建对象

Eng*_*uad 68 java static

谁能解释一下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);
    }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

false
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 104

  • 类初始化开始.最初,foo为null并且sFlag为false
  • 第一个静态变量initializer(foo)运行:
    • Foo创建了一个新实例
    • 用于flag执行的实例变量初始值设定项- 当前sFlag为false,因此值为flagfalse
  • 第二个静态变量initializer(sFlag)执行,将值设置为true
  • 类初始化完成
  • main跑,打印出来foo.flag,这是假的

请注意,如果sFlag声明final它将被视为编译时常量,此时对它的所有引用基本上都会被内联true,所以foo.flag也是如此.

  • +1为了很好的解释和'最终':) (15认同)
  • 静态成员按声明的顺序初始化.如果在创建实例之前声明sFlag,那么输出将为true. (5认同)

MBy*_*ByD 12

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

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

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

  3. sFlag初始化为true

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


shi*_*t66 5

当类被加载,sFlagfoo字段被初始化,但foo首先被初始化!
字段flag并且sFlag是布尔值,不能为空,因此默认情况下它是false,并且在初始化sFlag时仍然是false foo.flag = sFlag在这之后flag是假的.就是这样