[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-java-core-rasskazhite-pro-klonirovanie-obektov":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},87,"rasskazhite-pro-klonirovanie-obektov",2,"java-core","Java Core","☕","Расскажите про клонирование объектов.","Использование оператора присваивания не создает нового объекта, а лишь копирует ссылку на объект. Таким образом, две ссылки указывают на одну и ту же область памяти, на один и тот же объект. Для создания нового объекта с таким же состоянием используется клонирование объекта.\n\nКласс `Object` содержит `protected` метод `clone()`, осуществляющий побитовое копирование объекта производного класса. Однако сначала необходимо переопределить метод `clone()` как `public` для обеспечения возможности его вызова. В переопределенном методе следует вызвать базовую версию метода `super.clone()`, которая и выполняет собственно клонирование.\n\nЧтобы окончательно сделать объект клонируемым, класс должен реализовать интерфейс `Cloneable`. Интерфейс `Cloneable` не содержит методов относится к маркерным интерфейсам, а его реализация гарантирует, что метод `clone()` класса `Object` возвратит точную копию вызвавшего его объекта с воспроизведением значений всех его полей. В противном случае метод генерирует исключение `CloneNotSupportedException`. Следует отметить, что при использовании этого механизма объект создается без вызова конструктора.\n\nЭто решение эффективно только в случае, если поля клонируемого объекта представляют собой значения базовых типов и их обёрток или неизменяемых (immutable) объектных типов. Если же поле клонируемого типа является изменяемым ссылочным типом, то для корректного клонирования требуется другой подход. Причина заключается в том, что при создании копии поля оригинал и копия представляют собой ссылку на один и тот же объект. В этой ситуации следует также клонировать и сам объект поля класса.\n\nТакое клонирование возможно только в случае, если тип атрибута класса также реализует интерфейс `Cloneable` и переопределяет метод `clone()`. Так как, если это будет иначе вызов метода невозможен из-за его недоступности. Отсюда следует, что если класс имеет суперкласс, то для реализации механизма клонирования текущего класса-потомка необходимо наличие корректной реализации такого механизма в суперклассе. При этом следует отказаться от использования объявлений `final` для полей объектных типов по причине невозможности изменения их значений при реализации клонирования.\n\nПомимо встроенного механизма клонирования в Java для клонирования объекта можно использовать:\n\n+ **Специализированный конструктор копирования** - в классе описывается конструктор, который принимает объект этого же класса и инициализирует поля создаваемого объекта значениями полей переданного.\n+ **Фабричный метод** - (Factory method), который представляет собой статический метод, возвращающий экземпляр своего класса.\n+ **Механизм сериализации** - сохранение и последующее восстановление объекта в\u002Fиз потока байтов.","","middle",[15,16,17],"core","clone","object",[],null,{"title":21,"description":22,"ogTitle":21,"ogDescription":23,"keywords":24,"schemaAnswer":30,"featuredSnippetReady":31},"Клонирование объектов в Java — Gymterview","Как работает клонирование объектов в Java: метод clone(), интерфейс Cloneable, конструктор копирования, фабричный метод и сериализация. Ответ с примерами.","Как работает клонирование объектов в Java: метод clone(), интерфейс Cloneable, конструктор копирования и другие способы.",[25,26,27,28,29],"клонирование объектов Java","clone Java","Cloneable","копирование объектов","конструктор копирования","Для создания нового объекта с таким же состоянием используется клонирование. Класс Object содержит protected метод clone(), осуществляющий побитовое копирование объекта. Для клонирования необходимо переопределить clone() как public, вызвать super.clone() и реализовать интерфейс Cloneable. Если класс не реализует Cloneable, будет выброшено CloneNotSupportedException. Помимо встроенного механизма можно использовать конструктор копирования, фабричный метод или механизм сериализации.",true]