我在理解一个类有自身静态实例时的初始化顺序方面遇到了困难。同时,为什么这种行为似乎对于字符串有所不同。
请看下面的例子:
我不太清楚为什么字段
请看下面的例子:
public class StaticCheck {
private static StaticCheck INSTANCE = new StaticCheck();
private static final List<String> list =
new ArrayList<String>(Arrays.asList("hello"));
private static final Map<String, String> map =
new HashMap<String, String>();
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
我不太清楚为什么字段
name
不是null。根据类初始化的说明,静态字段在以下情况下被初始化:
http://javarevisited.blogspot.in/2012/07/when-class-loading-initialization-java-example.html
看上面的例子,我的想法如下:
- 静态字段在Java中在实例初始化之前被初始化。在这里,当我调用静态方法
getInstance()
时,它将导致类初始化,这意味着静态字段的初始化。在这种情况下,字段map
和list
不应该为null。 - 在上面的例子中,由于字段
INSTANCE
是静态的,所以它的对象初始化发生在其他字段未初始化时,并且它的构造函数在调用load()
时被调用。因此,字段list
和map
为null。那么为什么name
会被初始化呢?我有点困惑。