Java Clone
Класс `Object` определяет метод `clone()`, который позволяет создать копию объекта. Этот метод необходимо переопределить в классе, если требуется создание глубокой копии объекта. Если класс не переопределяет метод `clone()`, то при вызове этого метода на объекте будет брошено исключение `CloneNotSupportedException`.
Метод `clone()` возвращает объект типа `Object`, поэтому его возвращаемое значение необходимо привести к типу объекта, который требуется создать.
Для использования метода `clone()` необходимо в классе реализовать интерфейс `Cloneable`. Этот интерфейс является пустым маркерным интерфейсом, который указывает, что объекты класса могут быть клонированы.
Пример:
java
class MyClass implements Cloneable {
private int a;
private String b;
public MyClass(int a, String b) {
this.a = a;
this.b = b;
}
public void setA(int a) {
this.a = a;
}
public void setB(String b) {
this.b = b;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass(10, "Hello");
try {
// Создание глубокой копии объекта
MyClass obj2 = (MyClass) obj1.clone();
// Модификация значений полей
obj2.setA(20);
obj2.setB("World");
// Вывод значений полей объектов
System.out.println("obj1: a = " + obj1.getA() + ", b = " + obj1.getB());
System.out.println("obj2: a = " + obj2.getA() + ", b = " + obj2.getB());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
В данном примере создается класс `MyClass`, который реализует интерфейс `Cloneable`. В этом классе определены два приватных поля `a` и `b`, а также методы для установки значений этих полей. В методе `clone()` вызывается метод `clone()` из базового класса (`Object`), который создает клон объекта. Затем в `main` методе создается объект `obj1` класса `MyClass`. При помощи метода `clone()` создается глубокая копия этого объекта и присваивается переменной `obj2`. Затем в объекте `obj2` изменяются значения полей `a` и `b`. При выводе значений полей объектов `obj1` и `obj2` на экран, мы видим, что значение полей в этих объектах отличается.