Как класс объектов реализует метод clone()

в книге по Core Java я нашел этот отрывок:

подумайте о том, как Класс Object может реализовать clone. Он вообще ничего не знает об объекте, так это может сделать только поля копировать. Если все поля данных объекта числа или другие основные типы, копирование полей просто отлично. Но если объект содержит ссылки на подобъекты, затем копирование поля дает вам еще одну ссылку на subobject, поэтому оригинал и клонированные объекты все еще разделяют некоторые информация.

после прочтения этого мне стало интересно, что How is the clone method originally implemented in Object Class?

меня беспокоит вот что: как может метод в Object класс делает поле клоном поля объекта подкласса, когда он ничего не знает об этом классе?

2 ответов


на самом деле clone() реализован в собственном коде, поэтому я предполагаю, что он просто делает копию памяти (копирует все байты), не зная содержимого.

кроме того, есть API отражения, чтобы получить knowlegde о классе (который будет медленнее, однако).


читать такое от Javadoc:

клон защищенного объекта () -

создает и возвращает копию этого объект. Точное значение слова " копировать" может зависеть от класса объекта. Общее намерение состоит в том, что для любого объект x, выражение:

х.клон() != x

будет верно, и что выражение:

х.клон().getClass() == х.getClass()

будет верно, но это не абсолютное требование. Хотя это как правило, дело в том, что: X. clone().равно (x) будет истинно, это не является абсолютным требованием. От конвенция, возвращаемый объект должен получите, позвонив супер.клон. Если класс и все его суперклассы (кроме объекта) соблюдать настоящую конвенцию, будет так, что

х.клон().getClass () = = x.getClass ().

по соглашению, объект, возвращенный этот метод должен быть независимый этот объект (который клонируется).

для того чтобы достигнуть этой независимости, оно может потребоваться изменить один или несколько поля объекта, возвращаемого супер.клонируйте перед возвращением. Как правило, это означает копирование изменяемые объекты, которые включают внутренняя "глубокая структура" объект клонируется и заменяет ссылки на эти объекты с ссылки на копии. Если класс содержит только примитивные поля или ссылки на литературу к неизменяемым объектам, затем как правило, поля отсутствуют в объекте, возвращаемом super.клон нужно изменить.

означает, что когда у вас есть подобъект в вашем объекте, вы должны не просто клонировать / копировать его ссылку, но внутреннюю структуру этого объекта (для создания нового экземпляра), если каждый объект имеет свой очистить clone () methode вы сможете клонировать его как родительский объект, иначе вам придется создать новый экземпляр и копия его внутреннего поля качайте по одному.