Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
System.out.println("t2.p.x=" + t2.p.x + ", t2.height=" +12.height);
}
Результатом будет:
І2.р.х=1, і2.ІтеідІтг=3
То есть теперь все поля исходного и клонированного объектов стали Независимыми.
Реализация такого "неглубокого" клонирования в методе °^есісІопе() необходима, так как в противном случае клонирование второстепенного объекта могло бы привести к огромным затратам ресурсов ведь этот объект может содержать ссылки на более значимые объекты, а те при клонировании также начали бы копировать свои поля, и так далее Кроме того, типом поля клонируемого объекта может быть класс, не реализующий Cloneable, что приводило бы к дополнительным проблемам. Как показано в примере, при необходимости дополнительное копирование можно добавить самостоятельно.
Клонирование массивов
Итак, любой массив может быть клонирован. В этом разделе хотелось бы рассмотреть особенности, возникающие из-за того, что Object.с1опе() копирует только один объект.
Рассмотрим пример:
int а[]={1, 2, 3};
intb[]=(int[])a.clone();
а[0]=0;
System.out.println(b[0]);
Результатом будет ноль, что вполне очевидно, так как весь массив представлен одним объектом, который не будет зависеть от своей копии. Усложняем пример:
inta[][]={{1,2},{3}};
int b[][]=(int[][])a.clone();
if (-И
// первый вариант:
a[0]=newint[]{0};
System.out.println(b[0][0]); } else {
// второй вариант:
a[0][0]=0;
System. out.println(b[0][0]);
}
Разберем, что будет происходить в этих двух случаях. Начнем с того, что в первой строке создается двухмерный массив, состоящий из двух одномерных. Итого три объекта. Затем, на следующей строке при клонировании будет создан новый двухмерный массив, содержащий ссылки на те же самые одномерные массивы.
Теперь несложно предсказать результат обоих вариантов. В перв0>| случае в исходном массиве меняется ссылка, хранящаяся в первом эДе' менте, что не принесет никаких изменений для клонированного объекта. jja консоли появится 1.
Во втором случае модифицируется существующий массив, что скажется на обоих двухмерных массивах. На консоли появится 0.
Обратите внимание, что если из примера убрать условие if-else, так, чтобы отрабатывал первый вариант, а затем