Класс Object
- java.lang.Object
public class Object
Класс Object является корнем иерархии классов. Каждый класс имеет Object в качестве суперкласса. Все объекты, включая массивы, реализуют методы этого класса.
- С момента:
- 1.0
- См. также:
Class
Конструкторы
| Конструктор | Описание |
|---|---|
Object() | Создаёт новый объект. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object | clone() | Создаёт и возвращает копию этого объекта. |
boolean | equals(Object obj) | Указывает, является ли другой объект "равным" этому. |
protected void | finalize() | Устарело. Механизм финализации изначально проблематичен. |
Class<?> | getClass() | Возвращает класс выполнения этого объекта |
int | hashCode() | Возвращает значение хэш-кода для объекта. |
void | notify() | Разбуждает один поток, ожидающий монитор этого объекта. |
void | notifyAll() | Разбуживает все потоки, ожидающие монитор этого объекта. |
String | toString() | Возвращает строковое представление объекта. |
void | wait() | Заставляет текущий поток ожидать, пока он не будет разбужен, обычно путём уведомления или прерывания. |
void | wait(long timeoutMillis) | Заставляет текущий поток ожидать, пока он не будет разбужен, обычно путём уведомления или прерывания, или пока не истечёт определённое количество реального времени. |
void | wait(long timeoutMillis,
int nanos) | Заставляет текущий поток ожидать, пока он не будет разбужен, обычно путём уведомления или прерывания, или пока не истечёт определённое количество реального времени. |
Конструкторы
Объект
public Object()
Создаёт новый объект.
Методы
getClass
public final Class<?> getClass()
Возвращает выполняемый класс этого Object. Возвращаемый Class объект — это объект, который блокируется методами
static synchronized представленного класса.
Фактический тип результата — Class<? extends |X|>, где |X| — стирание статического типа выражения, на котором вызывается getClass. Например, в этом фрагменте кода приведение типов не требуется:
Number n = 0;
Class<? extends Number> c = n.getClass();
- Возвращает:
- Объект
Class, представляющий выполняемый класс этого объекта.
hashCode
public int hashCode()
Возвращает значение хэш-кода для объекта. Этот метод поддерживается для использования в хэш-таблицах, таких как предоставляемые HashMap.
Общее соглашение для hashCode:
- При каждом вызове на одном и том же объекте более одного раза во время выполнения Java-приложения метод
hashCodeдолжен последовательно возвращать одно и то же целое число, при условии, что информация, используемая в сравненияхequalsобъекта, не изменяется. Это целое число не обязательно должно оставаться неизменным от одного выполнения приложения к другому. - Если два объекта равны в соответствии с методом
equals(Object), тогда вызов методаhashCodeдля каждого из этих двух объектов должен давать один и тот же результат. - Не требуется, чтобы, если два объекта не равны в соответствии с методом
equals(java.lang.Object), тогда вызов методаhashCodeдля каждого из этих двух объектов должен давать различные целые значения. Однако программист должен понимать, что получение различных целых значений для неравных объектов может улучшить производительность хэш-таблиц.
По возможности, метод hashCode, определённый классом Object, возвращает различные целые числа для различных объектов. (Хэш-код может или не может быть реализован как некоторая функция адреса памяти объекта в какой-то момент времени.)
- Возвращает:
- значение хэш-кода для этого объекта.
- См. также:
-
equals(java.lang.Object),System.identityHashCode(java.lang.Object)
equals
public boolean equals(Object obj)
Указывает, равен ли некоторый другой объект этому.
Метод equals реализует отношение эквивалентности на ссылках на объекты, отличных от null:
- Он рефлексивен: для любого значения ссылки на объект, отличного от null,
x,x.equals(x)должен возвращатьtrue. - Он симметричен: для любых значений ссылок на объекты, отличных от null,
xиy,x.equals(y)должен возвращатьtrueтогда и только тогда, когдаy.equals(x)возвращаетtrue. - Он транзитивен: для любых значений ссылок на объекты, отличных от null,
x,yиz, еслиx.equals(y)возвращаетtrueиy.equals(z)возвращаетtrue, тогдаx.equals(z)должен возвращатьtrue. - Он постоянен: для любых значений ссылок на объекты, отличных от null,
xиy, многократные вызовыx.equals(y)последовательно возвращаютtrueили последовательно возвращаютfalse, при условии, что информация, используемая в сравненияхequalsобъектов, не изменяется. - Для любого значения ссылки на объект, отличного от null,
x,x.equals(null)должно возвращатьfalse.
Метод equals для класса Object реализует наиболее точное отношение эквивалентности на объектах; то есть, для любых значений ссылок на объекты, отличных от null, x и y, этот метод возвращает true тогда и только тогда, когда x и y ссылаются на один и тот же объект (x == y имеет значение true).
Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы сохранить общее соглашение для метода hashCode, в котором указано, что равные объекты должны иметь равные хэш-коды.
- Параметры:
-
obj- объект ссылки, с которым сравнивать. - Возвращает:
-
trueесли этот объект такой же, как аргумент obj;falseв противном случае. - См. также:
-
hashCode(),HashMap
clone
protected Object clone()
throws CloneNotSupportedException Создаёт и возвращает копию этого объекта. Точный смысл "копии" может зависеть от класса объекта. Общая идея заключается в том, что для любого объекта x, выражение:
x.clone() != xбудет истинным, и что выражение:
x.clone().getClass() == x.getClass()будет
true, но это не абсолютные требования. Хотя обычно x.clone().equals(x)будет
true, это не является абсолютным требованием.
По соглашению, возвращаемый объект должен быть получен путём вызова super.clone. Если класс и все его суперклассы (кроме Object) следуют этому соглашению, то x.clone().getClass() == x.getClass().
По соглашению, объект, возвращаемый этим методом, должен быть независимым от этого объекта (который клонируется). Для достижения этой независимости может потребоваться изменить один или несколько полей объекта, возвращаемого super.clone перед его возвращением. Обычно это означает копирование любых изменяемых объектов, составляющих внутреннюю "глубокую структуру" клонируемого объекта и замену ссылок на эти объекты ссылками на копии. Если класс содержит только примитивные поля или ссылки на неизменяемые объекты, то обычно не требуется изменять поля в объекте, возвращаемом super.clone.
Метод clone для класса Object выполняет определённую операцию клонирования. Во-первых, если класс этого объекта не реализует интерфейс Cloneable, то выбрасывается CloneNotSupportedException. Обратите внимание, что все массивы считаются реализующими интерфейс Cloneable, и что возвращаемый тип метода clone типа массива T[] равен T[], где T — любой тип ссылки или примитивный тип. В противном случае этот метод создаёт новый экземпляр класса этого объекта и инициализирует все его поля содержимым соответствующих полей этого объекта, как будто бы присваиванием; содержимое полей само по себе не клонируется. Таким образом, этот метод выполняет "поверхностную копию" этого объекта, а не операцию "глубокой копии".
Класс Object сам по себе не реализует интерфейс Cloneable, поэтому вызов метода clone для объекта, класс которого Object, приведёт к сбою во время выполнения.
- Возвращает:
- клон этого экземпляра.
- Исключения:
-
CloneNotSupportedException- если класс объекта не поддерживает интерфейсCloneable. Подклассы, переопределяющие методclone, также могут выбрасывать это исключение, чтобы указать, что экземпляр не может быть клонирован. - См. также:
Cloneable
toString
public String toString()
Возвращает строковое представление объекта. В общем случае, метод toString возвращает строку, которая "текстуально представляет" этот объект. Результат должен быть лаконичным, но информативным представлением, удобным для чтения человеком. Рекомендуется переопределять этот метод во всех подклассах.
Метод toString для класса Object возвращает строку, состоящую из имени класса, к которому относится объект, символа "@" и шестнадцатеричного представления хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:
getClass().getName() + '@' + Integer.toHexString(hashCode())
- Возвращает:
- строковое представление объекта.
notify
public final void notify()
Разбуждает единственную нить, ожидающую монитора этого объекта. Если какие-либо нити ожидают этот объект, одна из них выбирается для пробуждения. Выбор произвольный и происходит по усмотрению реализации. Нить ожидает монитор объекта, вызывая один из методов wait.
Разбуженная нить не сможет продолжить работу, пока текущая нить не освободит блокировку этого объекта. Разбуженная нить будет конкурировать обычным образом с другими нитями, которые могут активно конкурировать за синхронизацию на этом объекте; например, разбуженная нить не имеет ни надёжного преимущества, ни недостатка, будучи следующей нитью, которая заблокирует этот объект.
Этот метод должен вызываться только нитью, которая является владельцем монитора этого объекта. Нить становится владельцем монитора объекта одним из трёх способов:
- Выполнением синхронизированного метода экземпляра этого объекта.
- Выполнением тела оператора
synchronizedс синхронизацией на объекте. - Для объектов типа
Class,путём выполнения синхронизированного статического метода этого класса.
Только одна нить одновременно может владеть монитором объекта.
- Исключения:
-
IllegalMonitorStateException- если текущая нить не является владельцем монитора этого объекта. - См. также:
-
notifyAll(),wait()
notifyAll
public final void notifyAll()
Разбуждает все нити, ожидающие монитора этого объекта. Нить ожидает монитор объекта, вызывая один из методов wait.
Разбуженные нити не смогут продолжить работу, пока текущая нить не освободит блокировку этого объекта. Разбуженные нити будут конкурировать обычным образом с другими нитями, которые могут активно конкурировать за синхронизацию на этом объекте; например, разбуженные нити не имеют ни надёжного преимущества, ни недостатка, будучи следующей нитью, которая заблокирует этот объект.
Этот метод должен вызываться только нитью, которая является владельцем монитора этого объекта. См. метод notify для описания способов, которыми нить может стать владельцем монитора.
- Выбрасывает:
-
IllegalMonitorStateException- если текущий поток не является владельцем монитора этого объекта. - См. также:
-
notify(),wait()
wait
public final void wait()
throws InterruptedException Принуждает текущий поток к ожиданию, пока его не разбудят, обычно с помощью уведомления или прерывания.
Во всех отношениях этот метод ведет себя так, как если бы wait(0L, 0) был вызван. Подробности см. в спецификации метода wait(long, int).
- Выбрасывает:
-
IllegalMonitorStateException- если текущий поток не является владельцем монитора объекта -
InterruptedException- если какой-либо поток прервал текущий поток до или во время ожидания. Состояние прерывания текущего потока очищается при выбрасывании этого исключения. - См. также:
-
notify(),notifyAll(),wait(long),wait(long, int)
wait
public final void wait(long timeoutMillis)
throws InterruptedException Принуждает текущий поток к ожиданию, пока его не разбудят, обычно с помощью уведомления или прерывания, или пока не истечет определенное количество реального времени.
Во всех отношениях этот метод ведет себя так, как если бы wait(timeoutMillis, 0) был вызван. Подробности см. в спецификации метода wait(long, int).
- Параметры:
-
timeoutMillis- максимальное время ожидания в миллисекундах - Выбрасывает:
-
IllegalArgumentException- еслиtimeoutMillisотрицательно -
IllegalMonitorStateException- если текущий поток не является владельцем монитора объекта -
InterruptedException- если какой-либо поток прервал текущий поток до или во время ожидания. Состояние прерывания текущего потока очищается при выбрасывании этого исключения. - См. также:
-
notify(),notifyAll(),wait(),wait(long, int)
wait
public final void wait(long timeoutMillis,
int nanos)
throws InterruptedException Принуждает текущий поток к ожиданию, пока его не разбудят, обычно с помощью уведомления или прерывания, или пока не истечет определенное количество реального времени.
Текущий поток должен владеть блокировкой монитора этого объекта. См. метод notify для описания способов, которыми поток может стать владельцем блокировки монитора.
Этот метод помещает текущий поток (здесь обозначаемый как T) в набор ожидания для этого объекта, а затем высвобождает все синхронизационные притязания на этот объект. Обратите внимание, что высвобождаются только блокировки этого объекта; любые другие объекты, на которых текущий поток может быть синхронизирован, остаются заблокированными во время ожидания.
Поток T затем становится неактивным для целей планирования потоков и находится в состоянии ожидания до наступления одного из следующих событий:
- Какой-либо другой поток вызывает метод
notifyдля этого объекта, и поток T произвольно выбирается в качестве потока для пробуждения. - Какой-либо другой поток вызывает метод
notifyAllдля этого объекта. - Какой-либо другой поток прерывает поток T.
- Истекло заданное количество реального времени, приблизительно. Количество реального времени в наносекундах определяется выражением
1000000 * timeoutMillis + nanos. ЕслиtimeoutMillisиnanosоба равны нулю, то реальное время не учитывается, и поток ожидает пробуждения одним из других способов. - Поток T пробуждается случайным образом. (См. ниже.)
Поток T затем удаляется из набора ожидания для этого объекта и снова становится активным для планирования потоков. Он конкурирует обычным способом с другими потоками за право синхронизации с объектом; как только он восстановит контроль над объектом, все его синхронизационные притязания на объект возвращаются в исходное состояние – то есть в состояние на момент вызова метода wait.
Поток T возвращается из вызова метода wait.
Таким образом, по возвращении из метода wait, состояние синхронизации объекта и потока T точно такое же, как было при вызове метода wait.
Поток может проснуться без уведомления, прерывания или истечения времени, так называемое ложное пробуждение. Хотя это происходит редко на практике, приложения должны быть защищены от этого, проверяя условие, которое должно было вызвать пробуждение потока, и продолжая ожидание, если условие не выполнено. См. пример ниже.
Дополнительную информацию см. в разделе 14.2 «Очереди состояния» в книге Брайана Гойца и др. «Java Concurrency in Practice» (Addison-Wesley, 2006) или в пункте 69 в книге Джошуа Блоха «Effective Java, Second Edition» (Addison-Wesley, 2008).
Если текущий поток прерывается каким-либо потоком до или во время ожидания, выбрасывается InterruptedException. Состояние прерывания текущего потока очищается при выбрасывании этого исключения. Это исключение не выбрасывается до тех пор, пока состояние блокировки этого объекта не будет восстановлено, как описано выше.
- Примечание API:
- Рекомендуемый подход к ожиданию – проверка ожидаемого условия в цикле
whileвокруг вызоваwait, как показано в примере ниже. Этот подход, помимо прочего, позволяет избежать проблем, которые могут возникнуть из-за ложных пробуждений.synchronized (obj) { while (<condition does not hold> and <timeout not exceeded>) { long timeoutMillis = ... ; // recompute timeout values int nanos = ... ; obj.wait(timeoutMillis, nanos); } ... // Perform action appropriate to condition or timeout } - Параметры:
-
timeoutMillis- максимальное время ожидания в миллисекундах -
nanos- дополнительное время в наносекундах в диапазоне от 0 до 999999 включительно - Выбрасывает:
-
IllegalArgumentException- еслиtimeoutMillisотрицательно или значениеnanosвыходит за пределы диапазона -
IllegalMonitorStateException- если текущий поток не является владельцем монитора объекта -
InterruptedException- если какой-либо поток прервал текущий поток до или во время ожидания. Состояние прерывания текущего потока очищается при выбрасывании этого исключения. - См. также:
-
notify(),notifyAll(),wait(),wait(long)
finalize
@Deprecated(since="9")
protected void finalize()
throws Throwable finalize разных объектов не определен. Кроме того, нет гарантий относительно времени финализации. Метод finalize может быть вызван для финализируемого объекта только после неопределенной задержки, если вообще.Вызывается сборщиком мусора для объекта, когда сборка мусора определяет, что на объект больше нет ссылок. Подкласс переопределяет метод finalize для освобождения системных ресурсов или выполнения других действий по очистке.
Общая спецификация метода finalize заключается в том, что он вызывается, когда виртуальная машина Java определила, что к этому объекту больше нельзя получить доступ ни одному потоку, который еще не умер, за исключением случаев, когда это вызвано действием, предпринятым в результате финализации другого объекта или класса, который готов к финализации. Метод finalize может выполнить любое действие, включая повторную доступность этого объекта для других потоков; однако основное назначение метода finalize – выполнить действия по очистке перед окончательным удалением объекта. Например, метод finalize для объекта, представляющего соединение ввода/вывода, может выполнить явные операции ввода/вывода, чтобы разорвать соединение перед окончательным удалением объекта.
Метод finalize класса Object не выполняет никаких специальных действий; он просто возвращает управление.
Подклассы класса Object могут переопределить это определение.
Язык программирования Java не гарантирует, какой поток вызовет метод finalize для данного объекта. Однако гарантируется, что поток, вызывающий finalize, не будет удерживать какие-либо видимые пользователю блокировки синхронизации при вызове finalize.
Если метод finalize вызывает исключение, которое не обрабатывается, исключение игнорируется, и финализация этого объекта завершается.
После того, как метод finalize был вызван для объекта, никаких дальнейших действий не предпринимается, пока виртуальная машина Java вновь не определит, что к этому объекту больше нельзя получить доступ ни одному потоку, который еще не умер, включая возможные действия от других объектов или классов, готовых к финализации, после чего объект может быть удален.
Метод finalize никогда не вызывается виртуальной машиной Java для данного объекта более одного раза.
Любое исключение, сгенерированное методом finalize, останавливает финализацию этого объекта, но в остальном игнорируется.
- Примечание API:
- Классы, которые включают не-кучные ресурсы, имеют множество вариантов для их очистки. Класс должен гарантировать, что срок жизни каждого экземпляра превышает срок жизни любого ресурса, который он включает.
Reference.reachabilityFence(java.lang.Object)может быть использован для обеспечения того, чтобы объекты оставались доступными, пока ресурсы, встроенные в объект, используются.Подкласс должен избегать переопределения метода
finalizeза исключением случаев, когда подкласс включает не-кучные ресурсы, которые должны быть очищены перед сборкой экземпляра. Вызовы финализатора не цепляются автоматически, в отличие от конструкторов. Если подкласс переопределяетfinalize, он должен явно вызвать финализатор суперкласса. Для защиты от исключений, преждевременно прерывающих цепочку финализации, подкласс должен использовать блокtry-finally, чтобы гарантировать, чтоsuper.finalize()всегда вызывается. Например,@Override protected void finalize() throws Throwable { try { ... // cleanup subclass state } finally { super.finalize(); } } - Исключения:
-
Throwable- исключениеException, поднятое этим методом - См. также:
-
WeakReference,PhantomReference
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html