Класс Object
- java.lang.Object
public class Object
Класс Object является корнем иерархии классов. Каждый класс имеет Object в качестве суперкласса. Все объекты, включая массивы, реализуют методы этого класса.
- С момента:
- JDK1.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 timeout) Заставляет текущую нить ожидать, пока другая нить не вызовет метод |
void |
wait(long timeout,
int nanos) Заставляет текущую нить ожидать, пока другая нить не вызовет метод |
Конструкторы
Object
public Object()
Методы
getClass
public final Class<?> getClass()
Возвращает класс runtime данного Object. Возвращаемый Class объект является объектом, который блокируется методами static synchronized представленного класса.
Фактический тип результата — Class<? extends |X|>, где |X| — стирание статического типа выражения, к которому применяется getClass. Например, в этом фрагменте кода преобразование не требуется:
Number n = 0;
Class<? extends Number> c = n.getClass();
- Возвращает:
- Объект
Class, представляющий класс runtime данного объекта.
hashCode
public int hashCode()
Возвращает значение хэш-кода для объекта. Этот метод поддерживается для использования в хэш-таблицах, таких как предоставляемые HashMap.
Общий контракт для hashCode:
- Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения Java-приложения, метод
hashCodeдолжен последовательно возвращать одно и то же целое число, при условии, что информация, используемая вequalsсравнениях объекта, не изменяется. Это целое число не обязательно должно сохраняться постоянным между одним выполнением приложения и другим выполнением того же приложения. - Если два объекта равны согласно методу
equals(Object), то вызов методаhashCodeдля каждого из этих двух объектов должен возвращать одно и то же целое число. - Не требуется, чтобы если два объекта не равны согласно методу
equals(java.lang.Object), то вызов методаhashCodeдля каждого из этих двух объектов должен возвращать различные целые значения. Однако программист должен понимать, что возвращение различных целочисленных значений для неравных объектов может улучшить производительность хэш-таблиц.
По возможности метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но эта техника реализации не является обязательной для Java™-программного языка).
- Возвращает:
- значение хэш-кода для данного объекта.
- См. также:
-
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(long timeout)
throws InterruptedException Принуждает текущий поток ожидать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта, или не истечёт заданное время.
Текущий поток должен владеть монитором этого объекта.
Этот метод заставляет текущий поток (назовём его T) поместить себя в набор ожидания для этого объекта, а затем отказаться от всех синхронизационных притязаний на этот объект. Поток T становится неактивным для целей планирования потоков и остаётся неактивным до одного из четырёх событий:
- Некоторые другие потоки вызывают метод
notifyдля этого объекта, и поток T произвольно выбирается как поток, который должен быть разбужен. - Некоторые другие потоки вызывают метод
notifyAllдля этого объекта. - Некоторые другие потоки прерывают поток T.
- Истекло заданное реальное время, с большей или меньшей точностью. Если
timeoutравно нулю, реальное время не учитывается, и поток просто ждёт уведомления.
wait. Поток T затем возвращается из вызова метода wait. Таким образом, по возвращении из метода wait, состояние синхронизации объекта и потока T точно такое же, как и в момент вызова метода wait. Поток также может проснуться без уведомления, прерывания или истечения времени, что называется *ложным пробуждением*. Хотя это редко происходит на практике, приложения должны быть защищены от этого, проверяя условие, которое должно было вызвать пробуждение потока, и продолжая ожидать, если условие не выполняется. Иными словами, ожидания всегда должны выполняться в циклах, например, таком:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
} (Дополнительную информацию по этому вопросу см. в разделе 3.2.3 в книге Дуга Ли «Concurrent Programming in Java (Второе издание)» (Addison-Wesley, 2000) или в пункте 50 руководства Джошуа Блоха «Effective Java Programming Language Guide» (Addison-Wesley, 2001)). Если текущий поток прерывается любым потоком до или во время ожидания, то генерируется исключение InterruptedException. Это исключение не генерируется до тех пор, пока состояние блокировки этого объекта не будет восстановлено, как описано выше.
Обратите внимание, что метод wait, помещая текущий поток в набор ожидания для этого объекта, разблокирует только этот объект; любые другие объекты, на которых текущий поток может быть синхронизирован, остаются заблокированными, пока поток ждёт.
Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта. См. метод notify для описания способов, которыми поток может стать владельцем монитора.
- Параметры:
-
timeout— максимальное время ожидания в миллисекундах. - Исключения:
-
IllegalArgumentException— если значение timeout отрицательное. -
IllegalMonitorStateException— если текущий поток не является владельцем монитора объекта. -
InterruptedException— если любой поток прервал текущий поток до или во время ожидания уведомления. Состояние прерывания текущего потока сбрасывается при генерации этого исключения. - См. также:
-
notify(),notifyAll()
wait
public final void wait(long timeout,
int nanos)
throws InterruptedException Принуждает текущий поток ожидать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта, или пока другой поток не прервёт текущий поток, или не истечёт определённое реальное время.
Этот метод похож на метод wait с одним аргументом, но позволяет точнее управлять временем ожидания уведомления, прежде чем отказаться от ожидания. Реальное время, измеряемое в наносекундах, задаётся следующим образом:
1000000*timeout+nanos
Во всех остальных отношениях этот метод делает то же самое, что и метод wait(long) с одним аргументом. В частности, wait(0, 0) означает то же, что и wait(0).
Текущий поток должен владеть монитором этого объекта. Поток отпускает владение этим монитором и ждёт, пока не произойдёт одно из двух следующих событий:
- Другой поток уведомляет потоки, ожидающие на мониторе этого объекта, о пробуждении, либо через вызов метода
notifyили методаnotifyAll. - Истекло период ожидания, указанный аргументами
timeoutмиллисекунд плюсnanosнаносекунд.
Затем поток ждёт, пока не сможет повторно получить владение монитором, и возобновляет выполнение.
Как и в версии с одним аргументом, возможны прерывания и ложные пробуждения, и этот метод всегда следует использовать в цикле:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
} Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта. См. метод notify для описания способов, которыми поток может стать владельцем монитора.- Параметры:
-
timeout— максимальное время ожидания в миллисекундах. -
nanos— дополнительное время в наносекундах (диапазон 0-999999). - Исключения:
-
IllegalArgumentException— если значение timeout отрицательное или значение nanos не находится в диапазоне 0-999999. -
IllegalMonitorStateException— если текущий поток не является владельцем монитора этого объекта. -
InterruptedException— если любой поток прервал текущий поток до или во время ожидания уведомления. Состояние прерывания текущего потока сбрасывается при генерации этого исключения.
wait
public final void wait()
throws InterruptedException Принуждает текущий поток ожидать, пока другой поток не вызовет метод notify() или метод notifyAll() для этого объекта. Другими словами, этот метод работает точно так же, как если бы он просто выполнял вызов wait(0).
Текущий поток должен владеть монитором этого объекта. Поток отпускает владение этим монитором и ждёт, пока другой поток не уведомит потоки, ожидающие на мониторе этого объекта, о пробуждении, либо через вызов метода notify или метода notifyAll. Поток ждёт, пока не сможет повторно получить владение монитором, и возобновляет выполнение.
Как и в версии с одним аргументом, возможны прерывания и ложные пробуждения, и этот метод всегда следует использовать в цикле:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
} Этот метод должен вызываться только потоком, который является владельцем монитора этого объекта. См. метод notify для описания способов, которыми поток может стать владельцем монитора.- Исключения:
-
IllegalMonitorStateException— если текущий поток не является владельцем монитора объекта. -
InterruptedException— если любой поток прервал текущий поток до или во время ожидания уведомления. Состояние прерывания текущего потока сбрасывается при генерации этого исключения. - См. также:
-
notify(),notifyAll()
finalize
protected void finalize()
throws Throwable Вызывается сборщиком мусора для объекта, когда сборка мусора определяет, что больше нет ссылок на этот объект. Подкласс переопределяет метод finalize, чтобы освободить системные ресурсы или выполнить другую очистку.
Общая спецификация метода finalize заключается в том, что он вызывается, когда виртуальная машина Java определила, что к этому объекту больше нет доступа ни с какого потока, который ещё не завершился, за исключением действий, предпринятых при завершении финализации другого объекта или класса, готового к финализации. Метод finalize может выполнить любые действия, включая повторную доступность этого объекта для других потоков; однако основная цель метода finalize — выполнить действия по очистке перед окончательным удалением объекта. Например, метод finalize для объекта, представляющего соединение ввода/вывода, может выполнить явные операции ввода/вывода для разрыва соединения перед окончательным удалением объекта.
Метод finalize класса Object не выполняет никаких специальных действий; он просто возвращается нормально. Подклассы Object могут переопределить это определение.
Язык программирования Java не гарантирует, какой поток вызовет метод finalize для данного объекта. Однако гарантируется, что поток, вызывающий finalize, не будет удерживать какие-либо видимые пользователю блокировки синхронизации при вызове finalize. Если метод finalize выбросит необработанное исключение, это исключение игнорируется, и финализация этого объекта завершается.
После вызова метода finalize для объекта, никаких дальнейших действий не предпринимается до тех пор, пока виртуальная машина Java снова не определит, что к этому объекту больше нет доступа ни с какого потока, который ещё не завершился, включая возможные действия других объектов или классов, готовых к финализации, после чего объект может быть удалён.
Метод finalize никогда не вызывается виртуальной машиной Java более одного раза для любого данного объекта.
Любое исключение, выброшенное методом 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.