Есть ли окончательная ссылка на это в программировании?
Я вижу, что многие люди относятся к глубокому копированию и клонированию как к одному и тому же. Это правда?
Является ли он зависимым от языка?
Небольшая точка, но это меня беспокоило...
Есть ли окончательная ссылка на это в программировании?
Я вижу, что многие люди относятся к глубокому копированию и клонированию как к одному и тому же. Это правда?
Является ли он зависимым от языка?
Небольшая точка, но это меня беспокоило...
Нет формального определения этих понятий, по крайней мере, не одного, охватывающего все языки.
Что обычно обычно:
Да, есть разница. Что касается языковых зависимостей, некоторые языки могут делать все мелкие, глубокие, ленивые копии. Некоторые только делают мелкие копии. Так что да, иногда это зависит от языка.
Теперь возьмите, например, массив:
int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;
Теперь массив "numbersCopy" содержит те же значения, но, что более важно, сам объект массива указывает на ту же ссылку на объект, что и массив "numbers".
Итак, если бы я сделал что-то вроде:
numbersCopy[2] = 0;
Каким будет вывод для следующих операторов?
System.out.println(numbers[2]);
System.out.println(numbersCopy[2]);
Учитывая, что оба массива указывают на ту же ссылку, мы получим:
0
0
Но что, если мы хотим сделать отдельную копию первого массива со своей ссылкой? В этом случае мы хотели бы клонировать массив. При этом каждый массив будет иметь свою собственную ссылку на объект. Посмотрим, как это будет работать.
int [] numbers = { 2, 3, 4, 5};
int [] numbersClone = (int[])numbers.clone();
Теперь массив "numbersClone" содержит те же значения, но в этом случае сам объект массива указывает другую ссылку, чем массив "numbers".
Итак, если бы я сделал что-то вроде:
numbersClone[2] = 0;
Каким будет вывод для следующих операторов?
System.out.println(numbers[2]);
System.out.println(numbersClone[2]);
Вы догадались:
4
0
Я бы сказал, что копирование и клонирование являются аналогичными терминами. Единственное, что вам следует знать, это то, что вы получаете мелкую копию и глубокую копию. Мелкая копия только копирует объект на корневом уровне, где в качестве глубокой копии будет создана копия объекта и всех его дочерних объектов.
Самый краткий:
Отсутствие консенсуса, поскольку разработчики небрежно обменивают их; однако можно было бы лоббировать вышеизложенное на основе:
В С++ - "клонирование" земли обычно является идиомой для объектов с глубоким копированием объектов полиморфных классов.
В Java/С# я подозреваю, что эти термины используются более взаимозаменяемо.