Есть ли принципиальная разница между использованием super.clone() и созданием нового объекта с помощью new?
Пример:
public Space clone() throws CloneNotSupportedException {
return (Space)super.clone();
}
public Space clone() throws CloneNotSupportedException {
return new Space(number, square);
}
В документации Object.clone рекомендуется вызывать super.clone и приводятся доводы:
By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().
По соглашению, возвращаемый объект должен быть получен путем вызова super.clone. В случае если класс и все его предки (кроме Object) придерживаются соглашения, выполняется равенство x.clone().getClass() == x.getClass().
Дело в том, что Object.clone магическим образом возвращает объект, класс которого равен оригинальному. Это важно, т.к. позволяет наследникам не переопределять clone.
Приведу пример. Допустим, у класса Space есть наследник Subspace. Тогда следующий код в нем:
Subspace clone = (Subspace) this.clone();
,будет работать в первом случае и не будет во втором (вернется класс Space), что несколько неожиданно для клона.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники