Ответ
Нет, это не сработает. Даже если класс реализует интерфейс-маркер Cloneable, вы не можете напрямую вызвать унаследованный protected Object.clone() извне.
Почему?
- Модификатор доступа: Метод
clone()в классеObjectобъявлен какprotected. Его можно вызвать только из того же класса, его наследников или из того же пакета. - Контракт Cloneable: Интерфейс
Cloneableне содержит методов. Он лишь сигнализирует JVM, что для этого класса разрешено полевое копирование в реализацииObject.clone(). Без этого интерфейса вызовclone()выброситCloneNotSupportedException.
Правильная реализация клонирования:
class MyData implements Cloneable {
private int id;
private String name;
// 1. Переопределяем метод, делая его public
@Override
public MyData clone() {
try {
// 2. Вызываем нативную реализацию Object.clone()
// Она выполняет поверхностное копирование (shallow copy) всех полей.
return (MyData) super.clone();
} catch (CloneNotSupportedException e) {
// 3. Это исключение не должно произойти, т.к. мы реализуем Cloneable
throw new AssertionError("Класс реализует Cloneable");
}
}
}
// Использование
MyData original = new MyData();
MyData copy = original.clone(); // Теперь это работает.
Важно: Стандартное Object.clone() делает поверхностное копирование. Для сложных объектов с mutable-полями часто требуется глубокое копирование (deep copy), реализуемое вручную.