Какие методы класса Object вы знаете?

Какие методы класса Object вы знаете?

https://t.me/faangmaster

Все классы в Java наследуют класс Object. Официальная документация: Object.

Его методы:

1) getClass() - получить runtime класс объекта.

2) toString() - возвращает текстовое представление объекта

3) hashCode() - Возвращает hash code объекта. Используется, например, в HashMap. Смотри также мою статью про HashMap.

Контракт для hashCode:
Всегда должен возвращать одно и тоже значение для одного и того же объекта в рамках выполнения программы.
Если объекты равны по equals, то у них должен быть один и от же hashCode. Если у них одинаковый hashCode, то они не обязательно равны по equals.

Если этот метод не реализовать, то значение будет вычисляться на основе адреса объекта (конкретная логика зависит от JVM, на котором выполняется код).

4) equals(Object obj) - используется для сравнения объектов, а также в HashMap. Смотри также мою статью про HashMap. Сравнение по == для примитивов типа int будет сравнивать значения, для объектов будет сравнивать только ссылки, а не поля объектов. Поэтому рекомендуется для объектов реализовать метод equals (если не реализовать метод equals, то он будет работать как ==).

Правила, которым должен подчиняться метод equals:
Рефлексивность: x.equals(x) должна возвращать true для любого не null x
Симметричность: x.equals(y) должна возвращать истину тогда и только тогда, когда y.equals(x) возвращает истину для любых не null x, y
Транзитивность: Если x.equals(y) и y.equals(z), то x.equals(z) для любых не null x, y, z.
Consistency: для любых не null ссылочных значений x и y многократные вызовы x.equals(y) возвращают одно и тоже значение, при условии, что никакая информация, используемая в сравнениях на равенство для объектов, не изменяется.
Для любого не null x функция x.equals(null) должна возвращать false.

5) wait(). Заставляет поток ждать до тех пор, пока он не будет разбужен или прерван (interrupted). Необходимо вызывать только после получения монитора(лока) на объект, на котором он вызывается (иначе бросит исключение IllegalMonitorStateException). Также рекомендуется вызывать в цикле с условием, которые мы ждем. Это нужно, чтобы удостовериться, что поток был разбужен, когда действительно выполнилось условие, которое мы ждали. А также бывают спорадические пробуждения (но они очень редкие). Смотрите подробнее тут: wait().

Пример вызова wait:

//Прежде чем вызвать wait получаем монитор на объект (лок)

synchronized(obj) {

/*перед первым засыпанием и после каждого пробуждения по notify() или notifyAll() проверяем, выполняется ли условие, которое мы ждали, если нет, то ждем дальше)*/

while (!condition_to_wake_up) {

obj.wait();

}

}

После того, как wait успешно вызван - поток отпускает монитор/лок, чтобы его мог получить другой поток, который должен вызвать notify() или notifyAll(). После вызова notify() или notifyAll() на объекте, на котором мы ждем, поток будет разбужен и вновь попытается получить монитор/лок на объект. Если это получиться, то он проверит условие. Если оно выполняется, то поток продолжится, если нет - то поток снова вызовет wait() и перейдет в режим ожидания.

Смотри, также пример задачи на wait-notify: Ping-Pong или Робот

6) notifyAll() - пробуждает все потоки, которые ждут на объекте, на котором мы вызвали notifyAll(). Нужно вызывать только после получения монитора на объект, на котором мы хотим вызвать notifyAll() (иначе бросит исключение IllegalMonitorStateException).

Пример:

synchronized(obj) {

obj.notifyAll();

}

7) notify() - пробуждает один поток, который ждет на объекте, на котом мы вызвали notify(). Если ожидающих потоков много, то будет разбужет только один случайный из всех ожидающих на этом объекте.

8, 9) wait(long timeoutMillis), wait(long timeoutMillis, int nanos) - работает также как и wait(), только ждет лишь определенное время. Если его не разбудили за определенное время, то он просыпается сам.

10) clone() - Создает копию объекта. Объект также должен реализовывать интерфейс Cloneable, иначе на вызове метода clone() вывалится исключение CloneNotSupportedException.

11) finalize() - В новых версиях Java он deprecated. Его не рекомендуется использовать. Вызывается Garbage Collector перед тем как удалить объект.

Report Page