В Эффективной 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()
(на простом языке) была бы большой.