Путаница о клонированном интерфейсе и object.clone() в java
Если у меня есть:
class foo implements Cloneable
а затем выполните:
bar = new foo();
bar.clone();
Я получаю мелкую копию без необходимости писать какой-либо код bar.clone()
, как обычно мне нужно делать, когда я реализую интерфейс.
Я понимаю, что функции интерфейса должны быть заполнены классом, реализующим его, а Object.clone()
не имеет реализации (согласно документам "Объект класса сам не реализует интерфейс Cloneable" )
Итак, откуда мой мелкий клон? Где код, реализующий bar.clone()
, если Object.clone()
не имеет реализации? Я в замешательстве.
Ответы
Ответ 1
Будьте очень осторожны, используя клон. На самом деле, я бы полностью его избежал. Я никогда не нуждался в этом. НО... что, как говорится, лучшее обсуждение темы, которую я когда-либо читал, - Джошуа Блох, в "Эффективной Java". Прочтите пункт 11: "Отклонить клонирование разумно".
ПОЖАЛУЙСТА сделай себе одолжение и прочитай этот предмет. Я действительно рекомендую прочитать эту целую главу (и остальную часть книги). Все, что вам нужно знать о клоне, и почему я предупреждаю вас об этом.
Надеюсь, что это поможет.
Ответ 2
Object.clone() имеет реализацию:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()
Эта ссылка объясняет интерфейс Cloneable:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html
Объект должен реализовать интерфейс Cloneable для вызова метода clone(), иначе он выдает исключение CloneNotSupportedException.
По определению все классы в Java расширяют базовый класс Object, а класс Object имеет метод clone() по умолчанию, хотя сам объект не реализует Cloneable. Метод clone() класса Object будет вызываться, если вы не переопределите его самостоятельно.
Ответ 3
Если у меня есть: "class foo tools клонируемый"
а затем выполните: bar = new foo(); bar.clone();
Я получаю мелкую копию без необходимости написать любой bar.clone() код типа я обычно нужно будет делать, когда я реализовать интерфейс.
Это будет работать, только если вы вызываете его в классе "foo", потому что метод .clone(), унаследованный от Object
, защищен.
Я понимаю, что функции интерфейса должны быть заполнены в классе, реализующем его, и Object.clone() не имеет реализации (согласно документам, "Объект класса сам не реализует интерфейс Cloneable" )
(1) Object.clone()
имеет реализацию. Он создает мелкую копию объекта, если объект реализует Cloneable
. (2) Метод .clone()
не является частью какого-либо интерфейса. (3) Наличие метода .clone()
и реализация интерфейса Cloneable
- это совершенно разные вещи. Вам нужно реализовать интерфейс Cloneable
, если вы собираетесь использовать метод Object
clone
; однако это рекомендуемый способ написать метод clone
для вашего класса - получить его копию из метода суперкласса clone
, который в конечном итоге подходит к методу Object
clone
.