статический блок в классе не выполняется, хотя на него ссылаются

Я наткнулся на следующий код

class Super {
    static String ID = "QBANK";
}

class Sub extends Super {
    static {
        System.out.print("In Sub");
    }
}

public class Test{
    public static void main(String[] args){
        System.out.println(Sub.ID);
    }
}

Мы ссылаемся на класс Sub как на Sub.id. Итак, я ожидал, что статический блок в классе Sub будет выполнен и "In Sub" будет напечатан, но, к моему удивлению, это не так. Хотя идентификатор переменной виден для подкласса из суперкласса, поскольку мы ссылаемся на переменную, используя подкласс, я ожидаю, что она будет загружена первой. И если он загружается, статический блок должен выполняться.

Поскольку он не печатается, значит ли это, что подкласс вообще не загружен? Как это возможно, когда я четко ссылаюсь на это в своем коде. Я имею в виду, как можно было распознать класс, не загружаясь в память? Что-то мне не хватает?


person Aniket Thakur    schedule 11.06.2014    source источник
comment
Статические переменные не наследуются. Интересно, что Eclipse заменяет для меня Sub на Super. Поэтому я подозреваю, что происходят некоторые вещи во время компиляции.   -  person awksp    schedule 11.06.2014
comment
Переменные никогда не наследуются, будь то статические или экземплярные. Они затенены, но это не главное.   -  person Aniket Thakur    schedule 11.06.2014
comment
Ох, хорошо. Тогда статические поля не наследуются. Вы не звоните Sub.ID. Вы звоните Super.ID.   -  person awksp    schedule 11.06.2014
comment
Вы правы, ID находится в суперклассе, помните иерархию загрузки/инициации класса. ID найден в суперклассе, так что сделано там. Просто чтобы доказать это, измените свой код и переместите статическую переменную в Sub и прокомментируйте ее в super.   -  person kosa    schedule 11.06.2014
comment
Кстати, приложите больше усилий для форматирования кода в будущем.   -  person Jon Skeet    schedule 11.06.2014
comment
Интересно, что если вы запустите javap -c Test на этом, он скажет, что получает статический Field Sub.ID:Ljava/lang/String;!   -  person yshavit    schedule 11.06.2014
comment
Да то же самое для меня. Показано //Field test/Sub.ID:Ljava/lang/String; с java7.   -  person Aniket Thakur    schedule 11.06.2014
comment
Итак, похоже, что подкласс фактически загружен, но не инициализирован.   -  person Aniket Thakur    schedule 11.06.2014