Как класс Object реализует метод clone () - PullRequest
9 голосов
/ 21 марта 2011

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 21 марта 2011

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

Кроме того, есть API-интерфейс Reflection для получения знания о классе (что, однако, будет медленнее).

1 голос
/ 21 марта 2011

Прочитать это из Javadoc :

Защищенный объект clone () -

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

x.clone ()! = X

будет истинным, а выражение:

x.clone (). getClass () == x.getClass ()

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

x.clone (). GetClass () == x.getClass ().

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

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

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

...