Класс Объект
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, представляющий исполняемый класс этого объекта. - См. Спецификацию языка Java:
- 15.8.2 Литералы классов
hashCode
public int hashCode()
HashMap. Общий контракт метода hashCode:
- Всякий раз, когда он вызывается на одном и том же объекте более одного раза во время выполнения Java-приложения, метод
hashCodeдолжен последовательно возвращать то же целое число, при условии, что информация, используемая в сравненияхequalsобъекта, не изменяется. Это целое число не обязательно должно оставаться неизменным от одного выполнения приложения к другому выполнению того же приложения. - Если два объекта равны согласно методу
equals, то вызов методаhashCodeна каждом из этих двух объектов должен давать одинаковый результат. - Не требуется, чтобы, если два объекта не равны согласно методу
equals, то вызов методаhashCodeна каждом из этих двух объектов должен давать разные целые результаты. Однако программист должен понимать, что получение различных целых результатов для неравных объектов может улучшить производительность хэш-таблиц.
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, который гласит, что равные объекты должны иметь равные хэш-коды.Двухаргументный метод
Objects.equalsреализует отношение эквивалентности для двух возможных null ссылок на объекты. - Требования к реализации:
- Метод
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()
null.- Примечание API:
- В общем случае метод
toStringвозвращает строку, которая "текстово представляет" этот объект. Результат должен быть лаконичным, но информативным представлением, удобным для чтения человеком. Рекомендуется всем подклассам переопределять этот метод. Вывод строки не обязательно стабилен во времени или при различных вызовах JVM. - Требования к реализации:
- Метод
toStringдля классаObjectвозвращает строку, состоящую из имени класса, экземпляром которого является объект, символа "@" и шестнадцатеричного представления хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:МетодgetClass().getName() + '@' + Integer.toHexString(hashCode())Objects.toIdentityStringвозвращает строку для объекта, равную строке, которая была бы возвращена, если бы ни методыtoString, ни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» (Addison-Wesley, 2006) или в пункте 81 книги Джошуа Блоха «Эффективное использование Java, третье издание» (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, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/Object.html