clone() действует как конструктор копирования. Обычно он вызывает метод clone() суперкласса и т.д. пока не дойдет до Object.
Метод clone() класса Object создает и возвращает копию объекта с такими же значениями полей. Object.clone() кидает исключение CloneNotSupportedException если вы пытаетесь клонировать объект не реализующий интерфейс Cloneable. Реализация по умолчанию метода Object.clone() выполняет неполное/поверхностное (shallow) копирование. Если вам нужно полное/глубокое (deep) копирование класса то в методе clone() этого класса, после получения клона суперкласса, необходимо скопировать нужные поля.
Синтаксис вызова clone() следующий:
Object copy = obj.clone();
или чаще:
MyClass copy = (MyClass) obj.clone();
Один из недостатков метода clone(), это тот факт, что возвращается тип Object, поэтому требуется нисходящее преобразование типа. Однако начиная с версии Java 1.5 при переопределении метода вы можете сузить возвращаемый тип.
Пару слов о clone() и final полях.
Метод clone() несовместим с final полями. Если вы попробуете клонировать final поле компилятор остановит вас. Единственное решение - отказаться от final.
Ну и пример использования clone():
class MyClass implements Cloneable{
public Integer i = 10;
public MyClass clone() throws CloneNotSupportedException{
MyClass obj=(MyClass)super.clone();
obj.i = i;
return obj;
}
public String toString(){
return i.toString();
}
}
public class Temp {
public static void main(String []args) throws CloneNotSupportedException{
MyClass a = new MyClass();
a.i = 11;
MyClass b = a.clone();
MyClass c = a;
System.out.println("a: " + a + " b: " + b + " c: " + c);
a.i=12;
System.out.println("a: " + a + " b: " + b + " c: " + c);
}
}
Консоль:
a: 11 b: 11 c: 11
a: 12 b: 11 c: 12
Как видите, изменение объекта a повлекло за собой изменение объекта c, а вот с b всё в порядке.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.