当一个类有自己的静态实例时,我无法理解初始化顺序.此外,为什么这种行为似乎与String不同.
请参阅以下示例:
public class StaticCheck {
private static StaticCheck INSTANCE = new StaticCheck();
private static final List list =
new ArrayList(Arrays.asList("hello"));
private static final Map map =
new HashMap();
private static final String name = "hello";
public static StaticCheck getInstance() {
return INSTANCE;
}
private StaticCheck() {
load();
}
private void load() {
if(list != null) {
System.out.println("list is nonnull");
} else {
System.out.println("List is null");
}
if(name != null) {
System.out.println("name is nonnull");
} else {
System.out.println("name is null");
}
if(map != null) {
System.out.println("Map is nonnull");
} else {
System.out.println("Map is null");
}
}
public static void main(String[] args) {
StaticCheck check = StaticCheck.getInstance();
}
}
输出:
List is null
name is nonnull
Map is null
看看上面的例子,我的想法是:
>如上所述,静态字段在Java中的实例初始化之前初始化.这里,当我调用静态方法getInstance()时,它将导致类初始化,这意味着静态字段的初始化.在这种情况下,字段map和list不应为null.
>在上面的示例中,由于字段INSTANCE是静态的,因此其对象初始化发生,并且其构造函数在未初始化其他字段时调用load().因此,字段列表和映射为空.那么为什么名称会被初始化?我有点困惑.