假设我有一堂课
class A{
public final static TreeMap<String,String> tmap = new TreeMap<>();
int x;
static{
tmap.put("x:I", "Hello");
}
}
我创建了一个子类
class B extends A{
long y;
static{
tmap.put("y:J","World");
}
}
如果我现在编写一些代码来检查静态初始化程序:
class Main{
public static void main (String[] args){
B b = new B();
for(String v : b.tmap.values()){
System.out.println(v);
}
}
}
我知道这两个条目都必须在,tmap
因为A
最终必须加载,因为B
's super call 最迟。
但是,如果我正在阅读静态类初始化何时发生?正确地,我不能假设该Hello
值总是首先放入地图中,因为tmap
它是最终的。
因此,如果排序很重要(例如,如果我知道某些值可能会在层次结构中进一步更新/覆盖),我是否需要删除final
修饰符?
还是有其他东西已经强制执行“正确的”静态初始化程序排序?