Кто может объяснить, что происходит?Статический блок не называется
public class MagicFinal {
public static void main(String[] args) {
System.out.println(A.s);
}
}
class A {
static {
System.out.println("class has been loaded");
}
public static final String s = "final";
public static final Integer i = 3;
}
консоли:
окончательный
Что это? Я не понимаю, почему класс не был загружен, я знаю, что классы всегда загружаются при первом вызове. Поле s
находится в пуле строки, я вижу, что последний модификатор является магическим.
Если удалить окончательный модификатор (public static String s = "final"
) я буду получать
консоли:
класс был загружен
окончательный
Примечание: Я изменил поле i
: public static final int i = 3;
и показать его в conso ле. Я получил то же самое, что и в ситуации String. Зачем?
Хорошо, спасибо много! Как насчет int ?? открытый статический окончательный int i = 3; // не загружен класс записи public static final Integer i = 3; // загружен класс записи – idmitriev
Прочтите определение выражения константы времени компиляции, к которому я связался в своем ответе. 'int 'является примитивным значением,' String' является единственным частным случаем ссылочного значения, которое может быть использовано в константном выражении, а 'Integer' не является ни тем, ни другим. –
@marko - Вы говорите мне, что класс A вообще не загружается? или это случай ленивой инициализации ??? – TheLostMind