Что такое поверхностное копирование (shallow copy) объекта?

Ответ

Поверхностное копирование (shallow copy) создает новый объект, который является копией оригинала, но копирует только значения полей примитивных типов и ссылки на объекты. Сами объекты, на которые указывают ссылки, не клонируются.

Следствие: Оба объекта (оригинал и копия) разделяют одни и те же вложенные объекты. Изменение вложенного объекта через одну ссылку будет видно через другую.

Пример на Java:

class Person {
    public String name; // Поле-ссылка на объект String
    public int age;     // Примитивное поле
}

Person original = new Person();
original.name = "Alice";
original.age = 30;

// Поверхностное копирование (например, через Object.clone())
Person shallowCopy = new Person();
shallowCopy.name = original.name; // Копируется ССЫЛКА на строку "Alice"
shallowCopy.age = original.age;   // Копируется значение 30

shallowCopy.name = "Bob"; // Теперь shallowCopy.name ссылается на новый объект "Bob"
System.out.println(original.name); // "Alice" (не изменилось, т.к. String immutable)

// Пример с изменяемым вложенным объектом
class Department {
    public List<String> employees = new ArrayList<>();
}
Department dept1 = new Department();
dept1.employees.add("John");
Department dept2 = new Department();
dept2.employees = dept1.employees; // Поверхностное копирование ссылки на список

dept2.employees.add("Jane"); // Изменяем общий список
System.out.println(dept1.employees); // [John, Jane] (изменение видно в оригинале!)

Когда использовать? Когда вложенные объекты неизменяемы (immutable) или их разделение является допустимым. Для полной изоляции требуется глубокое копирование (deep copy).

Ответ 18+ 🔞

Ну ты смотри, какая история интересная вырисовывается, блядь! Вот сидишь ты, думаешь: «Скопировал объект — и все дела, живи спокойно». А нихуя подобного, сука!

Представь себе, что у тебя есть объект, как будто квартира. В ней стоит стол (это примитив, int age) и висит картина на стене (это ссылка, String name). Так вот, поверхностное копирование — это как снять слепок с двери, блядь. Ты получаешь новую дверь (новый объект), но за ней — всё та же самая, ёпта, квартира! Стол-то ты свой новый поставишь, а вот картина на стене останется одна на двоих. Подерёшь ты её в копии — и в оригинале тоже, сука, дыра будет!

Следствие, блядь, просто пиздец: Оба этих объекта, оригинал и его клон-ублюдок, тырят одни и те же вложенные штуки. Поменял что-то в одном месте — получил сюрприз в другом, волнение ебать!

Смотри, как это в коде выглядит, сука:

class Person {
    public String name; // Это ж ссылка, блядь, указатель на объект String!
    public int age;     // А это уже примитив, честный, простой
}

Person original = new Person();
original.name = "Alice";
original.age = 30;

// Делаем поверхностную копию, руками, как дурачки
Person shallowCopy = new Person();
shallowCopy.name = original.name; // СКОПИРОВАЛАСЬ ССЫЛКА, а не новая строка!
shallowCopy.age = original.age;   // А вот возраст скопировался честно, значение

shallowCopy.name = "Bob"; // А тут shallowCopy.name начинает смотреть на НОВЫЙ объект "Bob"
System.out.println(original.name); // "Alice" — не поменялось! Потому что String — он неизменяемый, хитрая жопа!

// А вот сейчас будет магия пострашнее, блядь!
class Department {
    public List<String> employees = new ArrayList<>(); // А это изменяемый объект, охуенно!
}
Department dept1 = new Department();
dept1.employees.add("John");
Department dept2 = new Department();
dept2.employees = dept1.employees; // Опять поверхностное копирование! Ссылку спиздили!

dept2.employees.add("Jane"); // Добавили в ОБЩИЙ список, сука!
System.out.println(dept1.employees); // [John, Jane] — вот тебе и сюрприз! Оригинал тоже изменился, пиздец!

Так когда же эту хуйню использовать? Да только тогда, когда вложенные объекты — каменные, неизменяемые, либо когда тебе похуй, что они общие. Хочешь полной изоляции, чтобы клон жил своей жизнью и не пакостил оригиналу? Тогда тебе нужно глубокое копирование, где каждый вложенный объект тоже клонируется, ебать мои старые костыли! А это уже отдельная песня, и часто — овердохуища работы.