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