Подтвердить что ты не робот

В чем разница между копированием и клонированием?

Есть ли окончательная ссылка на это в программировании?

Я вижу, что многие люди относятся к глубокому копированию и клонированию как к одному и тому же. Это правда?

Является ли он зависимым от языка?

Небольшая точка, но это меня беспокоило...

4b9b3361

Ответ 1

Нет формального определения этих понятий, по крайней мере, не одного, охватывающего все языки.

Что обычно обычно:

  • clone - создать что-то новое на основе чего-то, что существует.
  • копирование - копирование из чего-то, что существует в нечто другое (это уже существует).

Ответ 2

Да, есть разница. Что касается языковых зависимостей, некоторые языки могут делать все мелкие, глубокие, ленивые копии. Некоторые только делают мелкие копии. Так что да, иногда это зависит от языка.

Теперь возьмите, например, массив:

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

Источник

Ответ 3

Я бы сказал, что копирование и клонирование являются аналогичными терминами. Единственное, что вам следует знать, это то, что вы получаете мелкую копию и глубокую копию. Мелкая копия только копирует объект на корневом уровне, где в качестве глубокой копии будет создана копия объекта и всех его дочерних объектов.

Ответ 4

Самый краткий:

  • copy: копировать существующий экземпляр (неглубокий или глубокий)
  • clone: ​​копировать в новый экземпляр (всегда глубоко)

Отсутствие консенсуса, поскольку разработчики небрежно обменивают их; однако можно было бы лоббировать вышеизложенное на основе:

  • Этимология (биология) подразумевает, что понятие "мелкого клона" бессмысленно, поскольку оно не генетически идентично; клонирование подразумевает полноту для распространения объекта.
  • Копирование исторически подразумевает репликацию на существующую среду (копирование книги или живописи и т.д.). Например, ксерокопия копирует изображение на существующий лист бумаги; если бы кто-то мог клонировать лист бумаги, результатом стал бы новый лист бумаги.
  • Можно "скопировать" ссылку на объект, но никогда не будет "клонировать" ссылку на объект.

Ответ 5

В С++ - "клонирование" земли обычно является идиомой для объектов с глубоким копированием объектов полиморфных классов.

В Java/С# я подозреваю, что эти термины используются более взаимозаменяемо.