Я думаю, что реальная проблема заключается в том, что вы вынули из контекста следующее определение и неправильно его истолковали:
"Мелкая копия - это та, в которой мы копируем только значения поля от одного объекта к другому. Это разные объекты, но проблема в том, что когда мы изменяем какие-либо свойства исходного адреса, это также влияет на адрес shallowCopy. "
Это явно ссылается на какой-то пример ... который вы не цитировали. (Отсюда мой комментарий о том, что вы вывели его из контекста!)
Чтобы это описание было правильным, свойства "исходного адреса" должны быть полями, отдельными объектами от того, который вы клонируете. Я представляю, что пример выглядит примерно так:
public class User implements Cloneable {
String name;
Address address;
...
public User clone() {
return (User)(super.clone());
}
}
public class Address {
String street;
String city;
String zipCode;
}
, и они делают это:
Address address = new Address(...);
User user = new User("Fred", address);
User shallowCopy = user.clone();
, а затем
user.getAddress().setZipCode(...);
и наблюдают, что это меняется почтовый индекс, связанный с и оригиналом и клонированными User
объектами.
Обратите внимание, что мы изменяем свойства Address
, а не свойства User
. Как ясно сказано в цитируемом тексте.
Но ваш пример другой. В этом вы (соответственно) изменяете поле исходных и клонированных объектов. И наблюдение, что назначение одного не влияет на другое.
То, что вы делаете, эквивалентно
shallowCopy.setAddress(new Address(...));
Если вы это сделали, то объект, на который ссылается shallowCopy
, больше не будет быть поверхностной копией объекта, к которому относится user
, и user.getAddress().setZipCode(...)
больше не будет влиять на почтовый индекс shallowCopy
или наоборот .
Короче говоря, причина что вы видите нечто отличное от того, что говорится в определении, это то, что вы делаете что-то другое.
Клон работает точно так, как указано. Проблема в том, что вы неверно истолковали или неправильно применили определение мелкой копии.