2012-05-02 2 views
1

Я читаю о clone от Effective Java
Он говорит, что в clone первый метод будет называться должен быть super.clone()
В этом случае, я думаю, что в конце концов, мы в конечном итоге вызвав clone из java.lang.Object идти вверх по цепочке иерархии.
Но я думал, что клон объекта ничего не делает.
Глядя в код, я вижу:
protected native Object clone() throws CloneNotSupportedException; и без реализации.
Но из параграфа кажется, что если класс имеет только примитивные поля, вызывающие
(ClassX) super.clone(), то для создания клона достаточно.
Но как? super.clone от Object.Что делает клон супер?

+0

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

+2

'Object # clone' реализуется как собственный метод. См. Http://stackoverflow.com/questions/6825982/how-does-clone-work-under-the-hood –

ответ

3

Эта декларация в объекте

protected native Object clone() throws CloneNotSupportedException; 

... означает, что метод clone реализован в машинный код; т. е. за занавесом происходит волшебство.

Вы можете быть уверены, что Object.clone() действительно что-то делает ... при условии, что вы объявили свой класс как реализующий Cloneable. Но то, что это делает, не может быть выражено в простой Java.

+0

Итак, это работает для примитивных типов? То есть делает что-то вроде «memcopy»? – Jim

+0

Это немного напоминает memcopy. Он выполняет низкоуровневую копию всех полей и некоторую скрытую информацию в заголовке объекта. –

2

clone() - метод в Java для дублирования объекта. В Java объекты обрабатываются через ссылочные переменные, и нет оператора для копирования объекта - оператор присваивания дублирует ссылку, а не объект. Метод clone() предоставляет эту недостающую функциональность.

1

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

Если объект не поддерживает клонирование, он выбрасывает CloneNotSupportedException, это означает, что если вы попытаетесь клонировать супер-объект и получите исключение, вы можете 't реализовать объект clone также в вашем подтипе, и объект не может быть клонирован ... Существует несколько ситуаций, когда запрещается операция клонирования объектов.

Смежные вопросы