Класс Object
public class Object
Object является корнем иерархии классов. Каждый класс имеет Object в качестве суперкласса. Все объекты, включая массивы, реализуют методы этого класса.- С момента:
- 1.0
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Object() |
Создаёт новый объект. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, является ли какой-либо другой объект "равным" этому. |
protected void |
finalize() |
Устаревший, подлежит удалению: Этот элемент API может быть удалён в будущей версии. Финализация устарела и подлежит удалению в будущей версии. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хэш-кода для объекта. |
final void |
notify() |
Разбуживает единственную нить, которая ожидает монитора этого объекта. |
final void |
notifyAll() |
Разбуживает все нити, ожидающие монитора этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущую нить ждать, пока она не будет разбужена, обычно путём уведомления или прерывания. |
final void |
wait |
Заставляет текущую нить ждать, пока она не будет разбужена, обычно путём уведомления или прерывания, или пока не пройдёт определённое количество реального времени. |
final void |
wait |
Заставляет текущую нить ждать, пока она не будет разбужена, обычно путём уведомления или прерывания, или пока не пройдёт определённое количество реального времени. |
Подробное описание конструкторов
Объект
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, представляющий runtime-класс этого объекта. - См. Спецификацию языка Java:
- 15.8.2 Классовые литералы
hashCode
public int hashCode()
HashMap. Общий контракт метода hashCode:
- Каждый раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения Java-приложения, метод
hashCodeдолжен последовательно возвращать то же целое число, при условии, что никакие данные, используемые в сравненияхequalsобъекта, не изменяются. Это целое число не должно оставаться постоянным от одного выполнения приложения к другому. - Если два объекта равны согласно методу
equals, то вызов методаhashCodeдля каждого из двух объектов должен давать тот же результат. - Не требуется, чтобы, если два объекта не равны согласно методу
equals, то вызов методаhashCodeдля каждого из двух объектов давал различные целочисленные результаты. Тем не менее, программист должен понимать, что получение различных целочисленных результатов для неравных объектов может улучшить производительность хеш-таблиц.
- Требования к реализации:
- По возможности метод
hashCodeкласса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.
Отношение эквивалентности разбивает элементы на классы эквивалентности; все члены класса эквивалентности равны друг другу. Члены класса эквивалентности могут быть взаимозаменяемы, по крайней мере, в некоторых целях.
- Примечание API:
- В общем случае необходимо переопределять метод
hashCodeвсякий раз, когда переопределяется этот метод, чтобы поддерживать общий контракт для методаhashCode, который утверждает, что равные объекты должны иметь равные хеш-коды. - Требования к реализации:
- Метод
equalsклассаObjectреализует максимально возможное отношение эквивалентности для объектов; то есть для любых ссылок на объекты, отличных от null,xиy, этот метод возвращаетtrueтогда и только тогда, когдаxиyссылаются на один и тот же объект (x == yимеет значениеtrue). Другими словами, в рамках отношения эквивалентности ссылочной равенства каждый класс эквивалентности содержит только один элемент. - Параметры:
-
obj- объект-ссылка для сравнения. - Возвращает:
-
trueесли этот объект такой же, как аргумент obj;falseв противном случае. - См. также:
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, также могут выбрасывать это исключение, чтобы указать, что экземпляр не может быть клонирован. - См. также:
toString
public String toString()
- Примечание API:
- В общем случае метод
toStringвозвращает строку, "текстово представляющую" этот объект. Результат должен быть кратким, но информативным представлением, лёгким для чтения человеком. Рекомендуется, чтобы все подклассы переопределяли этот метод. Выходная строка не обязательно стабильна со временем или в разных вызовах JVM. - Требования к реализации:
- Метод
toStringдля классаObjectвозвращает строку, состоящую из имени класса, к которому относится объект, символа "@" и шестнадцатеричного представления хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:getClass().getName() + '@' + Integer.toHexString(hashCode())
- Возвращает:
- строковое представление объекта.
notify
public final void notify()
wait методов. Разбуженная нить не сможет продолжить выполнение, пока текущая нить не освободит блокировку этого объекта. Разбуженная нить будет конкурировать в обычном порядке с любыми другими нитями, которые могут активно конкурировать за синхронизацию на этом объекте; например, разбуженная нить не имеет ни надежного преимущества, ни недостатка в том, чтобы стать следующей нитью, заблокировавшей этот объект.
Этот метод должен вызываться только нитью, являющейся владельцем монитора этого объекта. Нить становится владельцем монитора объекта тремя способами:
- Выполняя синхронизированный экземплялярный метод этого объекта.
- Выполняя тело
synchronizedоператора, который синхронизируется на объекте. - Для объектов типа
Class,выполняя статический синхронизированный метод этого класса.
Только одна нить одновременно может владеть монитором объекта.
- Возбуждает:
-
IllegalMonitorStateException- если текущая нить не является владельцем монитора этого объекта. - См. также:
notifyAll
public final void notifyAll()
wait методов. Разбуженные нити не смогут продолжить выполнение, пока текущая нить не освободит блокировку этого объекта. Разбуженные нити будут конкурировать в обычном порядке с любыми другими нитями, которые могут активно конкурировать за синхронизацию на этом объекте; например, разбуженные нити не имеют ни надежного преимущества, ни недостатка в том, чтобы стать следующей нитью, заблокировавшей этот объект.
Этот метод должен вызываться только нитью, являющейся владельцем монитора этого объекта. См. метод notify для описания способов, которыми нить может стать владельцем монитора.
- Возбуждает:
-
IllegalMonitorStateException- если текущая нить не является владельцем монитора этого объекта. - См. также:
wait
public final void wait() throws InterruptedException
Во всех отношениях этот метод ведет себя так, как будто был вызван wait(0L, 0). Подробности см. в спецификации метода wait(long, int).
- Возбуждает:
-
IllegalMonitorStateException- если текущая нить не является владельцем монитора объекта -
InterruptedException- если какая-либо нить прервала текущую нить до или во время ожидания. Статус прерывания текущей нити сбрасывается при возникновении этого исключения. - См. также:
wait
public final void wait(long timeoutMillis) throws InterruptedException
Во всех отношениях этот метод ведет себя так, как будто был вызван wait(timeoutMillis, 0). Подробности см. в спецификации метода wait(long, int).
- Параметры:
-
timeoutMillis- максимальное время ожидания в миллисекундах - Возбуждает:
-
IllegalArgumentException- еслиtimeoutMillisотрицательно -
IllegalMonitorStateException- если текущая нить не является владельцем монитора объекта -
InterruptedException- если какая-либо нить прервала текущую нить до или во время ожидания. Статус прерывания текущей нити сбрасывается при возникновении этого исключения. - См. также:
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) или пункт 81 в книге Джошуа Блоха «Effective Java, Third Edition» (Addison-Wesley, 2018).
Если текущая нить прерывается любой другой нитью до или во время ожидания, возникает исключение 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- если какая-либо нить прервала текущую нить до или во время ожидания. Статус прерывания текущей нити сбрасывается при возникновении этого исключения. - См. также:
finalize
@Deprecated(since="9", forRemoval=true) protected void finalize() throws Throwable
Подклассы, переопределяющие finalize для выполнения очистки, должны использовать альтернативные механизмы очистки и удалить метод finalize. Используйте Cleaner и PhantomReference как более безопасные способы освобождения ресурсов, когда объект становится недоступным. В качестве альтернативы, добавьте метод close для явного освобождения ресурсов и реализуйте AutoCloseable для использования инструкции try-with-resources.
Этот метод останется до тех пор, пока финализаторы не будут удалены из большинства существующего кода.
finalize для освобождения системных ресурсов или выполнения других действий по очистке. При выполнении в виртуальной машине Java, в которой финализация отключена или удалена, сборщик мусора никогда не вызовет finalize(). В виртуальной машине Java, в которой финализация включена, сборщик мусора может вызвать 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, он должен явно вызвать финализатор суперкласса. Чтобы предотвратить преждевременное завершение цепочки finalize из-за исключений, подкласс должен использовать блокtry-finallyдля гарантии, чтоsuper.finalize()всегда вызывается. Например,@Override protected void finalize() throws Throwable { try { ... // cleanup subclass state } finally { super.finalize(); } } - Исключение:
-
Throwable-Exceptionподнятое этим методом - См. Спецификацию языка Java:
- 12.6 Финализация экземпляров класса
- См. также:
© 1993, 2023, 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/21/docs/api/java.base/java/lang/Object.html