Обычно clone () работает в тандеме с конструктором защищенного копирования. Это сделано потому, что clone (), в отличие от конструктора, может быть виртуальным.
В теле класса для Производного от суперкласса Base мы имеем
class Derived extends Base {
}
Итак, самое простое, вы бы добавили к этому конструктор виртуальной копии с помощью clone (). (В C ++ Джоши рекомендует клонировать как конструктор виртуальной копии.)
protected Derived() {
super();
}
protected Object clone() throws CloneNotSupportedException {
return new Derived();
}
Ситуация усложняется, если вы хотите вызвать super.clone (), как рекомендуется, и вам нужно добавить этих членов в класс, вы можете попробовать это
final String name;
Address address;
/// This protected copy constructor - only constructs the object from super-class and
/// sets the final in the object for the derived class.
protected Derived(Base base, String name) {
super(base);
this.name = name;
}
protected Object clone() throws CloneNotSupportedException {
Derived that = new Derived(super.clone(), this.name);
that.address = (Address) this.address.clone();
}
Теперь, если казнь, вы получите
Base base = (Base) new Derived("name");
и вы тогда сделали
Base clone = (Base) base.clone();
это вызовет clone () в классе Derived (тот, что выше), это вызовет super.clone () - который может быть или не быть реализован, но вам рекомендуется вызывать его. Затем реализация передает выходные данные super.clone () конструктору защищенных копий, который принимает Base, и вы передаете ему все конечные элементы.
Затем этот конструктор копирования вызывает конструктор копирования суперкласса (если вы знаете, что он есть) и устанавливает финалы.
Когда вы возвращаетесь к методу clone (), вы устанавливаете все не финальные элементы.
Проницательные читатели заметят, что если у вас есть экземпляр-конструктор в Base, он будет вызываться super.clone () - и будет вызываться снова при вызове супер-конструктора в защищенном конструкторе, так что вы дважды вызывать супер-конструктор копирования. Будем надеяться, что если он блокирует ресурсы, он узнает об этом.