Вопрос проверяет понимание различий между состоянием объекта и состоянием класса при сериализации.
static поля не сериализуются, потому что они принадлежат классу, а не объекту.final поля сериализуются, если они не static и их тип поддерживает сериализацию.
Модификатор final сам по себе не запрещает сериализацию.
После десериализации final поле будет восстановлено с сохранённым значением.
Таким образом, ключевым фактором является не final, а static.
Сериализация сохраняет состояние конкретного объекта, а не класса в целом.
static поляstatic поля:
общие для всех экземпляров
хранятся на уровне класса
не входят в состояние объекта
class Config implements Serializable {
static String version = "1.0";
}
После десериализации:
значение version берётся из текущего класса
сериализация на него не влияет
final поляfinal поля:
могут сериализоваться
сохраняют своё значение
восстанавливаются при десериализации
class User implements Serializable {
private final String name;
}
JVM использует специальные механизмы, чтобы восстановить final поле, даже без вызова конструктора.
Если поле одновременно:
static
final
оно не сериализуется, так как static имеет приоритет.
static поля никогда не сериализуются. final поля сериализуются без проблем, если они являются частью состояния объекта.