По умолчанию
protected – потому что универсальной реализации нет, а вызов приведет к
CloneNotSupportedException. Нужно писать свою реализацию, делать при этом ее
public и добавлять классу интерфейс
Cloneable. Подразумевается что этот метод делает «глубокое копирование», то есть поля-ссылки копи будут вести на копии полей оригинала. Это диктуется соглашением, по которому клон не должен зависеть от оригинала.
По контракту клон должен быть другим объектом (
!= оригиналу). Рекомендуется, чтобы все классы иерархии реализовывали
Cloneable, реализация метода начиналась с
super.clone() (если родитель не
Object), а результат был
equals и имел тот же класс что и оригинал.
Альтернативы (
многие считают что более удобные) метода
clone - конструктор копирования и паттерн factory method. Всё, что нужно знать о копировании объектов в Java можно найти в
Effective Java Item 11.