Я наткнулся на следующий код
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" будет напечатан, но, к моему удивлению, это не так. Хотя идентификатор переменной виден для подкласса из суперкласса, поскольку мы ссылаемся на переменную, используя подкласс, я ожидаю, что она будет загружена первой. И если он загружается, статический блок должен выполняться.
Поскольку он не печатается, значит ли это, что подкласс вообще не загружен? Как это возможно, когда я четко ссылаюсь на это в своем коде. Я имею в виду, как можно было распознать класс, не загружаясь в память? Что-то мне не хватает?
Sub
наSuper
. Поэтому я подозреваю, что происходят некоторые вещи во время компиляции. - person awksp   schedule 11.06.2014Sub.ID
. Вы звонитеSuper.ID
. - person awksp   schedule 11.06.2014javap -c Test
на этом, он скажет, что получает статическийField Sub.ID:Ljava/lang/String;
! - person yshavit   schedule 11.06.2014//Field test/Sub.ID:Ljava/lang/String;
с java7. - person Aniket Thakur   schedule 11.06.2014