Spec-Zone.ru › OpenJDK 24

Класс Объект

java.lang.Object
public class Object
Класс Object является корнем иерархии классов. Каждый класс имеет Object в качестве суперкласса. Все объекты, включая массивы, реализуют методы этого класса.
С момента:
1.0
См. также:
  • Class

Краткое описание конструкторов

Конструктор Описание
Object()
Создаёт новый объект.

Краткое описание методов

Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, является ли другой объект "равным" этому.
protected void finalize()
Устаревший, для удаления: Этот элемент API может быть удалён в будущей версии.
Финализация устарела и может быть удалена в будущих выпусках.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код для этого объекта.
final void notify()
Разбуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Разбуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать, пока он не будет разбужен, обычно с помощью уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать, пока он не будет разбужен, обычно с помощью уведомления или прерывания, или пока не пройдёт определённое количество реального времени.
final 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, представляющий исполняемый класс этого объекта.
См. Спецификацию языка Java:
15.8.2 Литералы классов

hashCode

public int hashCode()
Возвращает значение хэш-кода для этого объекта. Этот метод поддерживается для использования в хэш-таблицах, таких как предоставляемые классом HashMap.

Общий контракт метода hashCode:

  • Всякий раз, когда он вызывается на одном и том же объекте более одного раза во время выполнения Java-приложения, метод hashCode должен последовательно возвращать то же целое число, при условии, что информация, используемая в сравнениях equals объекта, не изменяется. Это целое число не обязательно должно оставаться неизменным от одного выполнения приложения к другому выполнению того же приложения.
  • Если два объекта равны согласно методу equals, то вызов метода hashCode на каждом из этих двух объектов должен давать одинаковый результат.
  • Не требуется, чтобы, если два объекта не равны согласно методу equals, то вызов метода hashCode на каждом из этих двух объектов должен давать разные целые результаты. Однако программист должен понимать, что получение различных целых результатов для неравных объектов может улучшить производительность хэш-таблиц.
Примечание API:
Методы hash и hashCode класса Objects могут быть использованы для построения простых хэш-кодов.
Требования к реализации:
Метод 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.

Отношение эквивалентности разбивает элементы, на которые оно действует, на классы эквивалентности; все члены класса эквивалентности равны друг другу. Члены класса эквивалентности взаимозаменяемы, по крайней мере, для некоторых целей.

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

Двухаргументный метод Objects.equals реализует отношение эквивалентности для двух возможных null ссылок на объекты.

Требования к реализации:
Метод equals класса Object реализует максимально различающее отношение эквивалентности для объектов; то есть, для любых не-null ссылок на объекты x и y, этот метод возвращает true только тогда, когда ссылки x и y указывают на один и тот же объект (x == y имеет значение true). Другими словами, в соответствии с отношением эквивалентности по ссылке, каждый класс эквивалентности содержит только один элемент.
Параметры:
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()
Возвращает строковое представление объекта. Выполнение контракта этого метода подразумевает, что должен быть возвращен результат, отличный от 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()
  • 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» (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 - если любая нить прервала текущую нить до или во время ожидания. Состояние прерывания текущей нити очищается при возникновении этого исключения.
См. также:
  • notify()
  • notifyAll()
  • wait()
  • wait(long)

finalize

@Deprecated(since="9", forRemoval=true) protected void finalize() throws Throwable
Устаревший, подлежит удалению: Этот элемент API может быть удалён в будущей версии.
Финализация устарела и подлежит удалению в будущей версии выпуска. Использование финализации может привести к проблемам с безопасностью, производительностью и надёжностью. См. JEP 421 для обсуждения и альтернатив.

Подклассы, переопределяющие метод 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 Финализация экземпляров классов
См. также:
  • WeakReference
  • PhantomReference

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API