предполагающей следующий пример:Статический блок инициализации в производном вложенного класса
public abstract class A {
public void readList() {
for (Integer o : InnerA.INT_LIST) {
System.out.println(o);
}
}
public static class InnerA {
protected static List<Integer> INT_LIST;
static {
INT_LIST = new ArrayList<Integer>();
INT_LIST.add(1);
}
}
}
public class B extends A {
public static class InnerB extends InnerA {
static {
INT_LIST.add(2);
}
}
}
Мой assumtion было, что, когда я называю
new B().readList();
выход будет
1
2
, но вместо того, чтобы это
1
Добавление конструктора
public B() {
new InnerB();
}
приводит к ожидаемому поведению. Я думал, поскольку вложенный класс является статическим, он инициализируется при создании нового объекта B (это, очевидно, когда A инициализируется).
Может кто-нибудь, пожалуйста, объясните мне это?
Спасибо.
Да, правильно, класс B никогда не загружается из-за ленивой загрузки. Таким образом, статический инициализатор никогда не выполняется. –
Хорошо, не знал об этой ленивой загрузке. Поэтому я либо переопределяю 'readList()', либо добавляю 'new InnerB()' в конструкторе B. Спасибо ** EDIT ** переопределяет 'readList()', и итерация через 'InnerB.INT_LIST' тоже не работает. Единственное, что работает, это вызов 'new InnerB()' в конструкторе B. – s1ck