Java: операция clone (), вызывающая super.clone () - PullRequest
37 голосов
/ 25 марта 2011

Я не до конца понимаю идею возврата super.clone () в метод clone () класса. Прежде всего, не будет ли это связано с возвратом объекта, который является суперклассом, который содержит данные МЕНЬШЕ, чем запрошено, потому что суперкласс "не является" подклассом, а подкласс "является" суперклассом. И если бы существовала длинная цепочка подклассов, каждый из которых вызывал super.clone (), почему это не привело бы к тому, что он в конечном итоге вызвал бы Object.clone () в корне цепочки, который не является ни одним из подклассов?

Извините, если это сбивает с толку; Я иногда путаюсь

Ответы [ 3 ]

51 голосов
/ 25 марта 2011

Реализация clone() в Object проверяет, реализует ли фактический класс Cloneable, и создает экземпляр этого фактического класса.

Так что, если вы хотите сделать свой класс клонируемым, у вас естьреализовать Cloneable и downcast результат super.clone() для вашего класса.Другое бремя заключается в том, что вызов super.clone() может выдать CloneNotSupportedException, который вы должны поймать, даже если вы знаете, что этого не произойдет (поскольку ваш класс реализует Cloneable).

Cloneable интерфейс и метод clone в классе Object являются очевидным случаем ошибочного объектно-ориентированного проектирования.

5 голосов
/ 25 марта 2011

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

Другими терминами, которые обычно связаны с клонированием, является мелкое и глубокое клонирование.мелкое клонирование относится к созданию точной копии объекта, в то время как глубокое клонирование создает реплику объекта и любого дочернего объекта, на который ссылается исходный объект.

Подробнее о клонировании на эта ссылка

4 голосов
/ 25 марта 2011

Читайте javadoc Object.clone() более внимательно: он возвращает копию объекта. Копия - это другой экземпляр того же класса, что и у объекта, для которого вызывается клон. То есть foo.clone().getClass() == foo.getClass().

...