Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Java .pdf
Скачиваний:
118
Добавлен:
16.03.2015
Размер:
1.32 Mб
Скачать

4.13 Класс Object

Класс Object находится на вершине иерархии классов Java. Object явно или косвенно наследуется всеми классами, поэтому переменная типа Object способна указывать на объект любого типа, будь то экземпляр какого-либо класса или массив. Правда, переменной типа Object нельзя непосредственно присваивать значения простых типов (таких как int, boolean и т.п.), но эти ограничения легко обойти, «запаковав» значения в объекты соответствующих классов-оболочек (Integer, Boolean и др.).

В составе класса Object определена целая группа методов, которые наследуются всеми производными классами. Эти методы можно условно разделить на две категории – прикладные методы и методы, обеспечивающие поддержку многопоточных вычислений. Вопросы, связанные с моделью многопоточности Java, будут рассмотрены далее. А здесь мы кратко рассмотрим прикладные методы класса Object и обсудим аспекты, касающиеся их возможного влияния на поведение объектов остальных классов.

4.13.1 Метод сравнения объектов

Метод сравнения объектов имеет следующее объявление:

public boolean equals(Object obj)

Метод проверяет, равны ли текущий объект и объект, на который указывает ссылка obj, переданная в качестве параметра, и возвращает значение true, если факт равенства установлен, и false – в противном случае.

Если необходимо проверить, указывают ли две ссылки на один и тот же объект, следует применять операторы == или !=. Метод equals() сопоставляет содержимое объектов.

154

Висходной реализации метода equals(), предусмотренной

вклассе Object, предполагается, что объект равен только самому себе, т.е.удовлетворяет условию this == obj.

4.13.2 Метод вычисления хеш-кода

Метод вычисления хеш-кода имеет следующее объявление:

public int hashCode()

Он возвращает значение хеш-кода (hash code) текущего объекта – числа, используемого для быстрого сравнения объектов. Каждый объект обладает собственным хеш-кодом, который находит применение в хеш-таблицах. В реализации по умолчанию предусмотрен возврат значения, которое, как правило, различно для разных объектов. Значение кода используется в процессе сохранения объекта в одной из хеш-коллекций. Если объект не изменял свое состояние, то значение хэш-кода не должно изменяться.

Методы вычисления хеш-кода и сравнения объектов связаны: «равные» объекты должны иметь одинаковые значения хеш-кодов (обратное, вообще говоря, неверно). Поэтому при переопределении одного из этих методов следует переопределять и другой.

4.13.3 Метод клонирования объектов

Метод клонирования объектов имеет следующее объявление:

protected Object clone() throws CloneNotSupportedException

Метод возвращает клон текущего объекта. Клон – это новый объект, являющийся копией текущего. Например, массивы поддерживают операцию клонирования:

int[] arrayCopy = (int []) array.clone();

В классе Object метод clone() является защищенным. Чтобы объекты конкретного класса можно было клонировать, метод clone() реализуется в этом конкретном классе. Вообще говоря, никто не гарантирует того, что результатом его выполнения будет

155

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

Класс должен реализовывать интерфейс-маркер (пустой интерфейс) Cloneable. Метод Object.clone() проверяет, реализован ли в классе, которому принадлежит текущий объект, интерфейc Cloneable, и выбрасывает исключение типа

CloneNotSupportedException, если ответ отрицательный.

Класс должен переопределять метод clone(). Результатом работы метода Object.clone() является точная копия

объекта, т.е. Object.clone() обеспечивает простое клонирование – копирование всех полей исходного объекта в объект-копию, и по завершении работы возвращается ссылка на созданный объект-копию. Метод вполне работоспособен во многих ситуациях, но при определённых обстоятельствах приходится его переопределять и дополнять.

Результат клонирования должен быть получен вызовом super.clone().

Пример 67. Простое клонирование объекта public Object clone() {

Object result = null; try {

result = super.clone();

} catch (CloneNotSupportedException ex) { } return result;

}

Простого клонирования может быть недостаточно, в этом случае применяется глубокое клонирование. В процессе глубокого клонирования соответствующие методы clone() вызываются для каждого объекта, обозначенного переменной-полем, и каждого элемента массива объектов. Процесс носит рекурсивный характер – клониро-

156

ванию подвергаются объекты, служащие членами других объектов, начиная от текущего. Т.е. если объект содержит ссылки на агрегированные объекты, после процедуры простого клонирования необходимо создать и их копии тоже (см. пример 68).

Пример 68. Глубокое клонирование public Object clone() { Object result = null;

try {

result = super.clone(); result.a = (...) a.clone();

//...

}catch (CloneNotSupportedException ex) { } return result;

}

4.13.4 Метод получения ссылки на описание класса

Метод получения ссылки на описание класса объявлен следующим образом:

public final Class getClass()

Метод возвращает ссылку на объект типа Class, который представляет информацию о классе текущего объекта на этапе выполнения программы. Данный класс относится к механизму т.н. рефлексии, который выходит за рамки настоящего пособия.

4.13.5 Метод завершения работы объекта

Методзавершенияработы объектаимеет следующее объявление:

protected void finalize() throws Throwable

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

157

Соседние файлы в предмете Программирование на Java