Подтвердить что ты не робот

Java: вызов функции clone() super.clone()

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

Извините, если это запуталось; Иногда я смущаюсь

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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