Путаница о клонированном интерфейсе и 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.