Spec-Zone.ru › OpenJDK 17

Класс Объект

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

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

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

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

Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, является ли другой объект "равным" этому.
protected void finalize()
Устаревший.
Механизм окончательной обработки (finalization) изначально проблематичен.
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 для каждого из этих двух объектов должен выдавать различные целочисленные результаты. Однако программист должен знать, что получение различных целочисленных результатов для неравных объектов может улучшить производительность хэш-таблиц.
Требования к реализации:
По возможности, метод 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 , который гласит, что равные объекты должны иметь равные хэш-коды.
Требования к реализации:
Метод 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()
Возвращает строковое представление объекта.
Примечание API:
В общем случае метод toString возвращает строку, которая "текстово представляет" этот объект. Результат должен быть кратким, но информативным представлением, удобным для чтения человеком. Рекомендуется, чтобы все подклассы переопределяли этот метод. Выходная строка не обязательно должна быть стабильной во времени или при разных вызовах JVM.
Требования к реализации:
Метод 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 может быть вызван для финализируемого объекта только после неопределенной задержки, если вообще. Классы, экземпляры которых содержат ресурсы, не принадлежащие куче, должны предоставить метод для явного освобождения этих ресурсов, а также должны реализовывать AutoCloseable, если это уместно. Cleaner и PhantomReference обеспечивают более гибкие и эффективные способы освобождения ресурсов, когда объект становится недоступным.
Вызывается сборщиком мусора для объекта, когда сборка мусора определяет, что к объекту больше нет ссылок. Подкласс переопределяет метод 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, 2021, 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/17/docs/api/java.base/java/lang/Object.html

Spec-Zone.ru

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