Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Класс Object

В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив.


// применимо к любому классу
Object obj = new Cat("Barsik");

В таком виде объект обычно не используют. Чтобы с объектом что-то сделать, нужно выполнить приведение типов.


Cat cat = (Cat) obj;

У класса есть несколько важных методов.

  • Object clone() - создаёт новый объект, не отличающий от клонируемого
  • boolean equals(Object obj) - определяет, равен ли один объект другому
  • void finalize() - вызывается перед удалением неиспользуемого объекта
  • Class<?> getClass() - получает класс объекта во время выполнения
  • int hashCode() - возвращает хеш-код, связанный с вызывающим объектом
  • void notify() - возобновляет выполнение потока, который ожидает вызывающего объекта
  • void notifyAll() - возобновляет выполнение всех потоков, которые ожидают вызывающего объекта
  • String toString() - возвращает строку, описывающий объект
  • void wait() - ожидает другого потока выполнения
  • void wait(long millis) - ожидает другого потока выполнения
  • void wait(long millis, int nanos) - ожидает другого потока выполнения

Методы getClass(), notify(), notifyAll(), wait() являются финальными и их нельзя переопределять.

Метод hashCode()

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

Для вычисления хеш-кода в классе String применяется следующий алгоритм.


int hash = 0;
for(int i = 0; i < length(); i++)
	hash = 31 * hash + charAt(i);

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

Значение хеш-кода возвращает целочисленное значение, в том числ и отрицательное.

Если в вашем классе переопределяется метод equals(), то следует переопределить и метод hashCode().

Метод toString()

Очень важный метод, возвращающий значение объекта в виде символьной строки.

Очень часто при использовании метода toString() для получения описания объекта можно получить набор бессмысленных символов, например, [I@421199e8. На самом деле в них есть смысл, доступный специалистом. Он сразу может сказать, что мы имеем дело с одномерным массивом (одна квадратная скобка), который имеет тип int (символ I). Остальные символы тоже что-то означают, но вам знать это не обязательно.

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


getClass().getName() + '@' + Integer.toHexString(hashCode())

Обычно принято переопределять метод, чтобы он выводил результат в читаемом виде.

Реклама