Метод clone

Модуль 2. Java Core
9 уровень , 3 лекция
Открыта
Метод clone, интерфейс Cloneable - 1

— Привет, Амиго!

— Привет, Ким.

— Я тебе расскажу про метод clone().

Цель этого метода – клонировать объект – т.е. создать его клон/копию/дубликат.

Если его вызвать, то Java-машина создаст и вернет дубликат объекта, у которого вызвали этот метод.

Клонирование объекта в классе Object реализовано очень примитивно – при клонировании создается всего один новый объект: просто создается еще один объект и его полям присваиваются значения полей объекта-образца.

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

— Гм. Не густо.

— Дело в том, что Java-машина не знает, какие объекты можно клонировать, а какие нет. Файлы, например, клонировать нельзя. Как и поток System.in.

Поэтому вопрос о полноценном клонировании был отдан на откуп разработчикам классов. Тут все было сделано по аналогии с методом equals. Даже есть свой аналог hashCode – это интерфейс Cloneable.

Интерфейс Cloneable – это так называемый интерфейс-маркер, который не содержит никаких методов. Он используется, чтобы маркировать (помечать) некоторые классы.

Если разработчик класса считает, что объекты класса можно клонировать, он помечает класс этим интерфейсом (наследует класс от Cloneable).

Если разработчика не устраивает стандартная реализация метода clone, он должен написать свою, которая будет создавать дубликат объекта правильным образом.

При вызове метода clone(), Java проверяет, был ли у объекта интерфейс Cloneable. Если да — клонирует объект методом clone(), если нет — выкидывает исключение CloneNotSupportedException.

— Т.е. мы должны или переопределить метод clone и написать его новую реализацию или унаследовать класс от Cloneable?

— Да, но переопределять метод все же придется. Метод clone() объявлен как protected, так что он доступен для вызова только классам из его пакета (java.lang.*) или классам-наследникам.

— Я немного запутался, так что же надо сделать, чтобы клонировать объект?

— Смотри, если ты хочешь воспользоваться «клонированием по умолчанию», которое реализовано в классе Object, тебе нужно:

а) Добавить интерфейс Cloneable своему классу

б) Переопределить метод clone и вызвать в нем базовую реализацию:

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
}

Или ты можешь написать реализацию метода clone полностью сам:

class Point 
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

— Интересный метод, буду пользоваться. Иногда…

12
Задача
Java Core, 9 уровень, 3 лекция
Недоступна
TableAdapter
Измени класс TableAdapter так, чтобы он адаптировал ATable к BTable. Метод getHeaderText должен возвращать такую строку "[username] : tablename". Пример, "[Amigo] : DashboardTable".
12
Задача
Java Core, 9 уровень, 3 лекция
Недоступна
Адаптер
Используй класс AdapterFileOutputStream, чтобы адаптировать FileOutputStream к новому интерфейсу AmigoStringWriter.
20
Задача
Java Core, 9 уровень, 3 лекция
Недоступна
Адаптация нескольких интерфейсов
Давай представим ситуацию, что с одной стороны у нас есть некая база данных, в которой хранятся данные. База данных имеет стандартный набор команд (методов) для предоставления данных, они описаны в интерфейсе IncomeData. Примеры представления данных приведены в комментариях около каждого метода. С другой стороны есть пользователи
20
Задача
Java Core, 9 уровень, 3 лекция
Недоступна
И еще один адаптер
Адаптировать Scanner к PersonScanner. Классом-адаптером является PersonScannerAdapter. В классе адаптере создать приватное финальное поле Scanner fileScanner. Поле инициализировать в конструкторе с одним аргументом типа Scanner. Данные в файле хранятся в следующем виде: Иванов Иван Иванович 31 12 19
20
Задача
Java Core, 9 уровень, 3 лекция
Недоступна
Закрепляем адаптер
Адаптировать Customer и Contact к RowItem. Классом-адаптером является DataAdapter. Инициализируйте countries перед началом выполнения программы. Соответствие кода страны и названия: UA Ukraine RU Russia CA Canada
Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 51
5 октября 2025
ту-ту-ту... да уж
Эльвира Уровень 57
1 октября 2025
задачи решились благодаря готовым решениям
Артём Уровень 110
15 октября 2024
Если в лекции присутствует базар-вокзал с Амиго, то это верный признак того, что текст будет абсолютно бесполезным. Задачи решились с помощью генератора методов ИДЕА и методом научного тыка.
Дмитрий Уровень 49
25 сентября 2024
Господи, что за бред пошел в этом курсе...
Дмитрий Уровень 49
25 сентября 2024
Это уже правда на насмешки больше похоже а не на курс...
Вадим Уровень 106
28 июля 2024
Вот для таких статей купил курс с ментором на год
Дмитрий Уровень 57 Expert
10 июля 2024
я так и не понял зачем в Глубокое клонирование карты делать новую LinkedHashMap и заполнять его клонированными объектами из старой мапы? это только хотелки автора задачи или это общие требования при использовании метода clone и коллекций? т.е. если ты делаешь клонирование объекта, который содержит коллекцию, например тот же HashMap, то ты обязан всегда переопределить метод clone и реализацией глубокого копирования? если я переопределяю метод clone и пишу в нем super.clone для объекта в котором есть коллекция этого не достаточно?
Ксения Уровень 37 Expert
4 февраля 2024
не поняла почему обязательно переопределять метод clone, раз он protected.. все наследники могут использовать этот метод с эти модификатором, а класс Object родитель всех классов вообще. Так в чем проблема?
Александр М Уровень 48
19 марта 2024
Допустим мы имеем свой класс. Модификатор доступа переопределённого метода в дочернем классе можно расширять или оставлять таким же, как и в родительском классе. Если бы метод clone() был public в Objectе, то все классы могли бы вызывать у нашего класса этот метод. Но нам оставили возможность установить protected, если хотим ограничить возможность вызова метода.
Владимир Кругман Уровень 51 Expert
3 декабря 2023
Мде... задания не соответствуют объему теории
Наталья Уровень 107
6 ноября 2023
Мда, информации абсолютно 0
9 октября 2023
Комент для тех, кто все понял и разделяет мнение жалобщиков)