Java初始化顺序问题,静态vs实例字段

Ele*_*eco 7 java

以下程序打印:

my name is:null

my name is:null

Someclass static init
Run Code Online (Sandbox Code Playgroud)

首次加载类时的AFAIK静态块和字段始终首先被初始化,实例块和字段被初始化.因此变量"objectName1"和"objectName2"应首先初始化,实例变量"list"second ...但是输出明显与此理论相矛盾...任何人都可以解释程序行为(我不是在寻找对它的批评设计本身btw)?

import java.util.ArrayList;
import java.util.List;

public class Main2{
    public static void main (String[] args){
        SomeClass.getInstance();
    }
}

class SomeClass {
    private static final SomeClass instance = new SomeClass();

    public static SomeClass getInstance(){
        return instance;
    }

    static {
        System.out.println ("Someclass static init");
    }
    private  static String objectName1  ="test1";
    private  static String objectName2  ="test2";

    @SuppressWarnings("serial")
    private  List<SomeObject> list=
        new ArrayList<SomeObject> ()  { {
 add (new SomeObject(objectName1));
 add (new SomeObject(objectName2));
    }};
}

class SomeObject {
    String name;
    SomeObject (String name){
        this.name = name;
        System.out.println ("my name is:" +name);
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 10

静态块按顺序初始化(因此您可以依赖上面的那些).通过创建SomeClass第一个静态初始化程序SomeClass的实例,您将在静态初始化阶段强制实例初始化.

因此,代码执行的逻辑顺序是:

  • 负载类SomeClass,所有静态字段最初的默认值(0,null,等)
  • 开始静态
  • 第一个静态init创建的实例 SomeClass
  • SomeClass例如,使用静态字段的当前值开始实例inits (so objectName1objectName2are null)
  • 加载SomeObject类,所有静态字段最初默认(你没有)
  • SomeObject静态inits(你没有)
  • 创建SomeObject使用传入null值的实例
  • 继续静态SomeClass,设置objectName1objectName2

为了使这项工作,你可能期望的那样,简单地把inits为objectName1objectName2初始化以上instance.