Класс Object
Если при описании класса мы не указываем никакое расширение, т. е. не пишем слово
extends
и имя класса за ним, как при описании класса
Pet
, то Java считает этот класс расширением класса
object
, и компилятор дописывает это за нас:
class Pet extends Object{ . . . }
Можно записать это расширение и явно.
Сам же класс
object
не является ничьим наследником, от него начинается иерархия любых классов Java. В частности, все массивы — прямые наследники класса
object
.
Поскольку такой класс может содержать только общие свойства всех классов, в него включено лишь несколько самых общих методов, например, метод
equals()
, сравнивающий данный объект на равенство с объектом, заданным в аргументе, и возвращающий логическое значение. Его можно использовать так:
Object objl = new Dog(), obj 2 = new Cat();
if (obj1.equals(obj2)) ...
Оцените объектно-ориентированный дух этой записи: объект
obj1
активен, он сам сравнивает себя с другим объектом. Можно, конечно, записать и
obj2.equals (obj1)
, сделав активным объект
obj2
, с тем же результатом.
Как указывалось в
главе 1,
ссылки можно сравнивать на равенство и неравенство:
obj1 == obj2; obj1 != obj 2;
В этом случае сопоставляются адреса объектов, мы можем узнать, не указывают ли обе ссылки на один и тот же объект.
Метод
equals()
же сравнивает содержимое объектов в их текущем состоянии, фактически он реализован в классе
object
как тождество: объект равен только самому себе. Поэтому его часто переопределяют в подклассах, более того, правильно спроектированные, "хорошо воспитанные", классы должны переопределить методы класса
object
, если их не устраивает стандартная реализация.
Второй метод класса
object
, который следует переопределять в подклассах, — метод
tostring ()
. Это метод без параметров, который пытается содержимое объекта преобразовать в строку символов и возвращает объект класса
string
.
К этому методу исполняющая система Java обращается каждый раз, когда требуется представить объект в виде строки, например, в методе
printing
.