Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 54
Ильдар Шаукатович Хабибуллин
Object objl = new Dog(), obj2 = new Cat(); if (obj1.equals(obj2)) ...
Оцените объектно-ориентированный дух этой записи: объект obj 1 активен, он сам сравнивает себя с другим объектом. Можно, конечно, записать и obj2.equals(obji), сделав активным объект obj 2, с тем же результатом.
Как указывалось в
obj 1 == obj 2; obj 1 ! = obj 2;
В этом случае сопоставляются адреса объектов, мы можем узнать, не указывают ли обе ссылки на один и тот же объект.
Метод equals () же сравнивает содержимое объектов в их текущем состоянии, фактически он реализован в классе Object как тождество: объект равен только самому себе. Поэтому его обычно переопределяют в подклассах; более того, правильно спроектированные, "хорошо воспитанные" классы должны переопределить методы класса Obj ect, если их не устраивает стандартная реализация. Например, в классе String метод equals () сравнивает не адреса размещения строк в оперативной памяти, а символы, из которых состоит строка, как мы увидим в
Второй метод класса Object, часто требующий переопределения,- метод hashCode( ) —
возвращает целое число, уникальное для каждого объекта данного класса, его идентификатор. Это число позволяет однозначно определить объект. Оно используется многими стандартными классами Java. Реализация метода hashCode (), сделанная в классе Obj ect, может оказаться недостаточной для какого-то подкласса. В таком случае метод hashCode () следует переопределить.
Третий метод класса Object, который следует переопределять в подклассах, — метод tostring (). Это метод без параметров, который выражает содержимое объекта строкой символов и возвращает объект класса string. В классе Object метод tostring() реализован очень скудно — он выдает имя класса и идентификатор объекта, возвращаемый методом hashCode (). Метод tostring() важен потому, что исполняющая система Java обращается к нему каждый раз, когда требуется представить объект в виде строки, например в методе println(). Обычно метод tostring() переопределяют так, чтобы он возвращал информацию о классе объекта и текущие значения его полей, записанные в виде строк символов.
Конструкторы класса
Вы уже обратили внимание на то, что в операции new, определяющей экземпляры класса, повторяется имя класса со скобками. Это похоже на обращение к методу, но что за "метод", имя которого полностью совпадает с именем класса?
Такой "метод" называется
□ Конструктор имеется в любом классе. Даже если вы его не написали, компилятор Java сам создаст
□ Конструктор выполняется автоматически при создании экземпляра класса, после распределения памяти и инициализации полей, но до начала использования создаваемого объекта.