Десериализация – полагается, что сериализационная форма уже была когда-то сконструирована, теперь же экземпляр просто восстанавливается с помощью метода readObject. Вызывается конструктор ближайшего не
serializable родителя.Внутри десериализация использует
ReflectionFactory.newConstructorForSerialization из пакета sun.reflect – метод создания объекта заданного типа с указанным (возможно родительским) конструктором. Можно использовать его напрямую. Конструктор всё же вызывается, но это может быть конструктор класса Object.Unsafe.allocateInstance – непосредственно создает экземпляр не вызывая конструктор, ничего лишнего.
Оба способа позволяют создать объект, не вызван ни конструктор, ни инициализаторы полей. Все члены остаются со значениями по-умолчанию (
null, 0, false). Однако для final поля дефолтным значением считается указанное в инициализации, оно и будет установлено. Пользуясь этими грязными хаками, помните: пакеты
sun.* никогда не были частью официально поддерживаемого API Java, и есть не во всех версиях Java.Подробнее читайте на хабре: 1, 2.
