Две вещи:
1) В первой форме нет необходимости поверхностно копировать элементы данных (clone.x = this.x).Object.clone () сделает это за вас.
2) Будьте осторожны при использовании второй формы: она всегда создает экземпляр конкретного типа A, поэтому, если вы расширяете A с помощью B, то B.clone ()больше не сможет использовать метод клона своего суперкласса.
- EDIT -
Что касается вашего вопроса, если метод clone () правильно реализован в иерархии класса X, тогда вызов super.clone () в реализации класса Xвернет экземпляр типа X .По умолчанию clone (), унаследованный от Object, является «магическим методом» в том смысле, что он создает экземпляр конкретного класса , из которого он вызывается.Он также выполняет поверхностную копию всех элементов данных.Обычно в реализации clone () выполняется глубокое копирование, чтобы избежать общих ссылок изменяемых объектов между источником и клоном.