2015-03-18 2 views
2

предполагающей следующий пример:Статический блок инициализации в производном вложенного класса

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 инициализируется).

Может кто-нибудь, пожалуйста, объясните мне это?

Спасибо.

ответ

1

Давайте посмотрим реализацию readList() первого:

public void readList() { 
    for (Integer o : InnerA.INT_LIST) { 
    System.out.println(o); 
    } 
} 

Очевидно, что печать всех элементов в InnerA.
Класс B расширяет класс A и не отменяет функцию readList(). Таким образом, поведение new B().readList() также печатает все элементы в InnerA.

Поскольку InnerA.INT_LIST содержит только элементы в статическом блоке InnerA, он имеет только 1 элемент.

На самом деле ваш код никогда не использует класс InnerB. JVM не загружает его, поэтому его статический блок не выполняется.

+1

Да, правильно, класс B никогда не загружается из-за ленивой загрузки. Таким образом, статический инициализатор никогда не выполняется. –

+0

Хорошо, не знал об этой ленивой загрузке. Поэтому я либо переопределяю 'readList()', либо добавляю 'new InnerB()' в конструкторе B. Спасибо ** EDIT ** переопределяет 'readList()', и итерация через 'InnerB.INT_LIST' тоже не работает. Единственное, что работает, это вызов 'new InnerB()' в конструкторе B. – s1ck

Смежные вопросы