Что такое конструктор копирования (Copy Constructor) в Java?

«Что такое конструктор копирования (Copy Constructor) в Java?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конструктор копирования (Copy Constructor) — это специальный конструктор класса, который принимает в качестве параметра объект этого же класса и инициализирует новый создаваемый объект, копируя состояние (значения полей) из переданного объекта.

Пример реализации:

public class Person {
    private String name;
    private int age;
    private Address address; // Изменяемый (mutable) объект

    // Обычный конструктор
    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Конструктор копирования (ПОВЕРХНОСТНАЯ копия - shallow copy)
    public Person(Person original) {
        this.name = original.name;
        this.age = original.age;
        this.address = original.address; // Копируется ссылка, не объект!
    }

    // Конструктор копирования (ГЛУБОКАЯ копия - deep copy)
    public Person(Person original) {
        this.name = original.name;
        this.age = original.age;
        // Создаём новый объект Address, копируя его поля
        this.address = new Address(original.address.getStreet(), original.address.getCity());
    }
}

// Использование
Person original = new Person("Alice", 30, new Address("Main St", "Boston"));
Person copy = new Person(original); // Создаётся новый объект Person
Сравнение с другими способами копирования: Способ Механизм Глубина копии Плюсы Минусы
Конструктор копирования Вызов конструктора Зависит от реализации (часто shallow) Полный контроль, не требует Cloneable Нужно писать код для каждого класса
Клонирование (clone()) Реализация интерфейса Cloneable По умолчанию shallow, можно переопределить Стандартный механизм Сложная корректная реализация, CloneNotSupportedException
Присваивание (=) Копирование ссылки Нет копии объекта Просто Создаётся вторая ссылка на тот же объект

Когда использовать:

  • Для создания независимой копии изменяемого (mutable) объекта.
  • Когда нужен больший контроль над процессом копирования, чем предоставляет clone().
  • Для реализации неизменяемых (immutable) объектов, которые могут принимать данные из существующих.