В Effective Java автор утверждает, что:
Если класс реализует Cloneable,
Метод клона объекта возвращает
полевая копия объекта;
в противном случае это бросает
CloneNotSupportedException.
Что я хотел бы знать, так это то, что он имеет в виду под полевым копированием. Означает ли это, что если класс имеет в памяти X байтов, он просто скопирует этот фрагмент памяти? Если да, то могу ли я предположить, что все типы значений исходного класса будут скопированы в новый объект?
class Point implements Cloneable{
private int x;
private int y;
@Override
public Point clone() {
return (Point)super.clone();
}
}
Если то, что делает Object.clone()
, является копией поля за полем класса Point
, я бы сказал, что мне не нужно явно копировать поля x
и y
, так как код, показанный выше будет более чем достаточно, чтобы сделать клон класса Point
. То есть следующий бит кода является избыточным:
@Override
public Point clone() {
Point newObj = (Point)super.clone();
newObj.x = this.x; //redundant
newObj.y = this.y; //redundant
}
Я прав?
Я знаю, что ссылки на клонированный объект будут автоматически указывать туда, куда указывали ссылки на исходный объект, я просто не уверен, что конкретно происходит с типами значений. Если бы кто-то мог ясно заявить, что спецификация алгоритма Object.clone()
(на простом языке) была бы великолепна.