Учитывая следующий простой код на Java.
final class Demo
{
public static final long serialVersionUID=1L;
static
{
System.out.println("Static constructor invoked.");
}
}
public final class Main
{
public static void main(String... args)
{
System.out.println(Demo.serialVersionUID);
}
}
В этом простейшем Java-коде ожидается, что конструктор static
будет вызываться, когда класс Demo
инициализируется с помощью метода main()
через Demo.serialVersionUID
, но не выполняется.
Если бы эта программа была запущена без изменений, вывод был бы только 1
(сообщение Вызван статический конструктор, указанное в блоке static
, не отображалось бы).
Если мы хотим, чтобы сообщение печаталось, как указано в инициализаторе static
, нам нужно изменить оператор объявления в классе Demo
,
public static final long serialVersionUID=1L;
либо,
public static long serialVersionUID=1L;
удаление модификатора final
или,
public static final Long serialVersionUID=1L;
изменение примитивного типа long
на соответствующий тип оболочки Long
.
Итак, почему оно так себя ведет? Почему не выводит сообщение в конструкторе static
без указанных изменений в программе?
long
(примитив) необходимо изменить наLong
(оболочку), чтобы отобразить это сообщение. - person Tiny   schedule 21.04.2014static final
примитивы илиString
являются константами времени компиляции, поэтому их значения жестко закодированы там, где на них ссылаются, а не на самом деле ссылаются, что позволяет избежать необходимости фактической загрузки класса. - person JonK   schedule 21.04.2014