Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив.
// применимо к любому классу
Object obj = new Cat("Barsik");
В таком виде объект обычно не используют. Чтобы с объектом что-то сделать, нужно выполнить приведение типов.
Cat cat = (Cat) obj;
У класса есть несколько важных методов.
Методы getClass(), notify(), notifyAll(), wait() являются финальными и их нельзя переопределять.
Хеш-код - это целое число, генерируемое на основе конкретного объекта. Его можно рассматривать как шифр с уникальным значением.
Для вычисления хеш-кода в классе String применяется следующий алгоритм.
int hash = 0;
for(int i = 0; i < length(); i++)
hash = 31 * hash + charAt(i);
У любого объекта имется хеш-код, определяемый по умолчанию, который вычисляется по адресу памяти, занимаемой объектом.
Значение хеш-кода возвращает целочисленное значение, в том числ и отрицательное.
Если в вашем классе переопределяется метод equals(), то следует переопределить и метод hashCode().
Очень важный метод, возвращающий значение объекта в виде символьной строки.
Очень часто при использовании метода toString() для получения описания объекта можно получить набор бессмысленных символов, например, [I@421199e8. На самом деле в них есть смысл, доступный специалистом. Он сразу может сказать, что мы имеем дело с одномерным массивом (одна квадратная скобка), который имеет тип int (символ I). Остальные символы тоже что-то означают, но вам знать это не обязательно.
Если же вам нужно научное объяснение, то метод работает по следующему алгоритму (из документации).
getClass().getName() + '@' + Integer.toHexString(hashCode())
Обычно принято переопределять метод, чтобы он выводил результат в читаемом виде.