Статические инициализаторы и окончательные константы в Java

Учитывая следующий простой код на 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 без указанных изменений в программе?


person Tiny    schedule 21.04.2014    source источник
comment
В основном я хотел узнать причину, по которой long (примитив) необходимо изменить на Long (оболочку), чтобы отобразить это сообщение.   -  person Tiny    schedule 21.04.2014
comment
Одно из требований к тому, чтобы поле было константой времени компиляции, состоит в том, что оно должно быть либо примитивом, либо строкой.   -  person Bhesh Gurung    schedule 21.04.2014
comment
Марко Топольник дал отличный ответ именно на этот вопрос по вопросу, который я связал. Это сводится к тому, что static final примитивы или String являются константами времени компиляции, поэтому их значения жестко закодированы там, где на них ссылаются, а не на самом деле ссылаются, что позволяет избежать необходимости фактической загрузки класса.   -  person JonK    schedule 21.04.2014