Главная » Java » Класс Object Java

0

 

Класс Object находится на вершине иерархии классов Java. Object явно или косвенно наследуется всеми классами, поэтому переменная типа Object способна указывать на объект любого типа, будь то экземпляр какого-либо класса или массив. Например, разработанный нами класс Attr предназначен для хранения атрибутов любого типа, поэтому его поле value объявлено как ссылка на объект типа Object. полю value (и любой переменной типа Object) нельзя непосредственно присваивать значения простых типов (таких как int, boolеаn и т.п.), но это ограничение легко обойти, "запаковав" значения в объекты соответствующих классов-оболочек (Integer, Boolean и др.), которые подробно описаны в главе 11.

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

public boolean equals(Object obj)

Проверяет, равны ли текущий объект и объект, на который указывает ссылка obj, переданная в качестве параметра, и возвращает значение true, если факт равенства установлен, и false – в противном случае. Если необходимо проверить, указывают ли две ссылки на один и тот же объект, следует применять операторы == или! =. Метод equals сопоставляет содержимое объектов. В исходной реализации метода equals, предусмотренной в классе Object, предполагается, что объект равен только самому себе, Т.е. удовлетворяет условию this == obj.

public int hashCode()

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

 

protected Object clone() throws CloneNotSupportedException Возвращает клон текущего объекта. Клон - это новый объект, являющийся копией текущего. Вопросы клонирования объектов подробно освещены в следующем разделе.

public final Class getClass()

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

protected void finalize() throws Throwable

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

public String toString()                                                                       .

Возвращает строковое представление объекта. Метод tоString вызывается неявно, когда ссылка на объект употребляется в качестве операнда в контексте выражений конкатенации строк с помощью оператора +. Версия метода toString, реализованная в классе Object, по умолчанию возвращает строку, содержащую наименование класса, которому принадлежит текущий объект, символ @ и шестнадцатеричное представление хеш-кода объекта.

 

Оба метода, hashcode и equals, должны быть переопределены, если необходимо придать понятию равенства объектов иной смысл, отличный от того, который предлагается классом Object. По умолчанию считается, что любые два различных объекта "не равны", Т.е. метод equals возвращает значение false, и их хеш-коды, как правило, различны.

 

Если версия метода equals, реализованная в некоем классе, допускает "равенство" двух различных объектов, их хеш-коды, возвращаемые соответствующими вариантами метода hashCode, также должны быть равны. Дело в том, что механизм хеширования тесно связан с методом еquаls, возвращающим true, если в хеш-таблице найден ключ с заданным значением. Например, в классе String метод equals переопределен таким образом, что он возвращает true, если оба сопоставляемых объекта String обладают одинаковым содержимым. В классе String также переопределен и метод hashcode – он возвращает значение, непосредственно зависящее от содержимого строки, так что две одинаковые строки неизбежно будут иметь один и тот же хеш-код.

 

Термин тождественность (identity) применяется в отношении равенства ссылок на объекты: если две ссылки тождественны, Т.е. указывают на один объект, оператор сравнения == возвратит значение true. Термин равнозначность (equivalence) используется для выражения факта равенства значений - метод equals возвращает true, если значения совпадают (причем ссылки на них могут быть и не тождественны). Поэтому мы вправе сказать, что реализация метода equals в классе Object, предлагаемая по умолчанию, предусматривает совпадение понятий тождественности и равнозначности. Класс, в котором понятие равенства расширяется, способен "производить" объекты – не тождественные, но равнозначные – посредством переопределения метода equal 5 таким образом, чтобы тот возвращал true, принимая во внимание внутреннее состояние объектов, а не возможность совпадения ссылок на них.

 

В некоторых типах хеш-таблиц при поиске ключей учитывается тождественность ссылок на объекты, а не равнозначность самих объектов. Если вам необходимо создать подобную таблицу-класс, следует позаботиться о том, чтобы хеш-коды соответствовали свойству тождественности объектов, а не их состоянию. Метод System.identityHashCode возвращает то же значение, которое мог бы возвратить метод hashCode класса Object, если этот метод в производном классе не переопределен.

 

Упражнение 3.7. Переопределите в составе класса Vehicle унаследованные методы equals и hashCode.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии