Создание копии объекта на первый взгляд кажется простой задачей:
Просто скопируйте значения всех свойств в другой экземпляр того же класса.
Но как насчет переменных, которые являются ссылками на другие объекты? Копии этих ссылочных значений означают, что они будут указывать на те же объекты, что и первый класс.
Но, может быть, это не то, что мы хотим. Возможно, мы хотим, чтобы все объекты, на которые ссылается копия, также были независимыми копиями.
Эти два типа копий объектов называются:
мелкая копия - точная битовая копия всех атрибутов исходного объекта
глубокое копирование - примитивы копируются точно, но объекты, на которые ссылаются, копируются, а не сами ссылки.
Класс Object, который наследуется всеми классами Java, включает метод clone (), который будет делать точные битовые копии всех свойств.
Однако clone () является защищенным методом. Таким образом, данный объект не может быть клонирован экземплярами каких-либо классов вне пакета (если они не являются подклассами класса этого объекта). Это позволяет конструктору классов явно указывать, какие клоны (мелкие или глубокие) создавать.
Java требует классы, которые хотят переопределить метод clone () для реализации клонируемого интерфейса. Метод clone () также должен быть общедоступным, чтобы переопределять ограничения доступа.
Например, класс HashTable реализует cloneable. Его метод clone () делает поверхностную копию, поэтому ключи и значения скопированной HashTable будут ссылаться на те же объекты, что и оригинал.
Однако многие основные классы Java не поддерживают клонирование. Если для таких классов вызывается метод clone (), возникает исключение CloneNotSupportedException.