Object
是类层次结构的根。每个类都将 Object
作为超类。所有对象,包括数组,都实现了这个类的方法。
- 自版本:
- 1.0
- 另请参见:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected Object
clone()
创建并返回此对象的副本。boolean
指示某个其他对象是否与此对象“相等”。protected void
finalize()
已弃用,将来会移除:此 API 元素可能会在将来的版本中移除。终结已被弃用,并可能在将来的版本中移除。final Class
<?> getClass()
返回此Object
的运行时类。int
hashCode()
返回对象的哈希码值。final void
notify()
唤醒正在等待此对象监视器的单个线程。final void
唤醒正在等待此对象监视器的所有线程。toString()
返回对象的字符串表示形式。final void
wait()
使当前线程等待,直到被“通知”或“中断”为止。final void
wait
(long timeoutMillis) 使当前线程等待,直到被“通知”或“中断”为止,或者直到经过一定的实际时间。final void
wait
(long timeoutMillis, int nanos) 使当前线程等待,直到被“通知”或“中断”为止,或者直到经过一定的实际时间。
-
Constructor Details
-
Object
public Object()构造一个新对象。
-
-
Method Details
-
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
的一般约定是:- 实现要求:
-
尽可能地,由类
Object
定义的hashCode
方法为不同的对象返回不同的整数。 - 返回:
- 此对象的哈希码值。
- 另请参见:
-
equals
指示某个其他对象是否与此对象“相等”。equals
方法在非空对象引用上实现了等价关系:- 它是自反的:对于任何非空引用值
x
,x.equals(x)
应该返回true
。 - 它是对称的:对于任何非空引用值
x
和y
,如果且仅如果x.equals(y)
返回true
,则y.equals(x)
应该返回true
。 - 它是传递的:对于任何非空引用值
x
,y
和z
,如果x.equals(y)
返回true
并且y.equals(z)
返回true
,则x.equals(z)
应该返回true
。 - 它是一致的:对于任何非空引用值
x
和y
,多次调用x.equals(y)
应该一致地返回true
或一致地返回false
,前提是在对象上用于equals
比较的信息未被修改。 - 对于任何非空引用值
x
,x.equals(null)
应该返回false
。
等价类;等价类的所有成员彼此相等。等价类的成员可以互换使用,至少对于某些目的而言是这样的。
- API 注释:
-
通常需要在重写此方法时重写
hashCode
方法,以保持hashCode
方法的一般约定,即相等的对象必须具有相等的哈希码。 - 实现要求:
-
类
Object
的equals
方法实现了对象上最具有区别力的等价关系;也就是说,对于任何非空引用值x
和y
,只有当x
和y
引用同一个对象(x == y
的值为true
)时,此方法才返回true
。换句话说,在引用相等等价关系下,每个等价类只有一个元素。 - 参数:
-
obj
- 用于比较的引用对象。 - 返回:
-
如果此对象与 obj 参数相同,则返回
true
;否则返回false
。 - 另请参见:
- 它是自反的:对于任何非空引用值
-
clone
创建并返回此对象的副本。 “副本”的确切含义可能取决于对象的类。一般意图是,对于任何对象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
返回的对象中的字段不需要被修改。- 实现要求:
-
类
Object
的clone
方法执行特定的克隆操作。首先,如果此对象的类未实现接口Cloneable
,则会抛出CloneNotSupportedException
。请注意,所有数组都被认为实现了接口Cloneable
,并且数组类型T[]
的clone
方法的返回类型是T[]
,其中 T 是任何引用或原始类型。否则,此方法将创建此对象类的新实例,并将其所有字段初始化为与此对象的相应字段的内容完全相同,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅复制”,而不是“深复制”操作。Object
本身不实现接口Cloneable
,因此在运行时调用Object
类的对象的clone
方法将导致在运行时抛出异常。 - 返回:
- 此实例的克隆。
- 抛出:
-
CloneNotSupportedException
- 如果对象的类不支持Cloneable
接口。重写clone
方法的子类也可以抛出此异常,以指示无法克隆实例。 - 另请参见:
-
toString
返回对象的字符串表示形式。- API注释:
-
通常情况下,
toString
方法返回一个字符串,该字符串“文本表示”此对象。结果应该是简洁但信息丰富的表示,易于人们阅读。建议所有子类都重写此方法。字符串输出不一定随时间稳定或在JVM调用之间稳定。 - 实现要求:
-
对于类
Object
,toString
方法返回一个字符串,该字符串由对象是其实例的类的名称、at符号`@
'和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回一个等于以下值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
- 返回:
- 对象的字符串表示形式。
-
notify
public final void notify()唤醒等待在此对象监视器上的单个线程。如果有任何线程在此对象上等待,则会选择其中一个来唤醒。选择是任意的,并由实现自行决定。线程通过调用wait
方法在对象的监视器上等待。唤醒的线程在当前线程放弃对此对象的锁定之前将无法继续。唤醒的线程将以通常的方式与可能正在积极竞争以在此对象上同步的任何其他线程竞争;例如,唤醒的线程在成为下一个锁定此对象的线程方面没有可靠的特权或劣势。
此方法只能由拥有此对象监视器的线程调用。线程以以下三种方式之一成为对象监视器的所有者:
- 通过执行该对象的同步实例方法。
- 通过执行同步在该对象上同步的
synchronized
语句的主体。 - 对于
Class
类型的对象,通过执行该类的静态同步方法。
一次只能有一个线程拥有对象的监视器。
- 抛出:
-
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。 - 参见:
-
notifyAll
public final void notifyAll()唤醒等待在此对象监视器上的所有线程。线程通过调用wait
方法在对象的监视器上等待。唤醒的线程在当前线程放弃对此对象的锁定之前将无法继续。唤醒的线程将以通常的方式与可能正在积极竞争以在此对象上同步的任何其他线程竞争;例如,唤醒的线程在成为下一个锁定此对象的线程方面没有可靠的特权或劣势。
此方法只能由拥有此对象监视器的线程调用。有关线程如何成为监视器所有者的描述,请参阅
notify
方法。- 抛出:
-
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。 - 参见:
-
wait
使当前线程等待,直到被唤醒,通常是通过通知或中断。在所有方面,此方法的行为就像调用了
wait(0L, 0)
一样。有关详细信息,请参阅wait(long, int)
方法的规范。- 抛出:
-
IllegalMonitorStateException
- 如果当前线程不是对象监视器的所有者 -
InterruptedException
- 如果在当前线程等待之前或期间,任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除。 - 参见:
-
wait
使当前线程等待,直到被唤醒,通常是通过通知或中断,或者直到经过一定的实际时间。在所有方面,此方法的行为就像调用了
wait(timeoutMillis, 0)
一样。有关详细信息,请参阅wait(long, int)
方法的规范。- 参数:
-
timeoutMillis
- 等待的最长时间,以毫秒为单位 - 抛出:
-
IllegalArgumentException
- 如果timeoutMillis
为负数 -
IllegalMonitorStateException
- 如果当前线程不是对象监视器的所有者 -
InterruptedException
- 如果在当前线程等待之前或期间,任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除。 - 参见:
-
wait
使当前线程等待,直到被唤醒,通常是通过通知或中断,或者直到经过一定的实际时间。当前线程必须拥有此对象的监视器锁。请参阅
notify
方法,了解线程如何成为监视器锁的所有者的描述。此方法导致当前线程(在此处称为T)将自己放置在此对象的等待集中,然后放弃对此对象的所有同步声明。请注意,只有此对象上的锁定将被放弃;当前线程可能同步的任何其他对象在线程等待时仍然被锁定。
然后,线程T因线程调度目的而被禁用,并处于休眠状态,直到发生以下情况之一:
- 其他某个线程为此对象调用
notify
方法,并且线程T恰好被选择为要唤醒的线程。 - 其他某个线程为此对象调用
notifyAll
方法。 - 其他某个线程
中断
了线程T。 - 经过了指定的实际时间,多或少。实际时间的纳秒数由表达式
1000000 * timeoutMillis + nanos
给出。如果timeoutMillis
和nanos
都为零,则不考虑实际时间,线程将等待直到被其他原因唤醒。 - 线程T被虚假唤醒。 (见下文。)
然后,线程T从此对象的等待集中移除,并重新启用以进行线程调度。它将以通常的方式与其他线程竞争以获得对对象的同步权利;一旦它重新获得对对象的控制,所有其对对象的同步声明将恢复到先前的状态 - 也就是说,与调用
wait
方法时的情况相同。然后,线程T从wait
方法的调用返回。因此,从wait
方法返回时,对象的同步状态和线程T
的同步状态与调用wait
方法时完全相同。线程可以在没有被通知、中断或超时的情况下唤醒,这称为虚假唤醒。虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件,并在条件不满足时继续等待来防范。请参阅下面的示例。
有关此主题的更多信息,请参阅Brian Goetz等人的《Java并发实践》(Addison-Wesley,2006)第14.2节“条件队列”或Joshua Bloch的《Effective Java,第三版》(Addison-Wesley,2018)第81项。
如果当前线程在等待时被任何线程
中断
,则会抛出InterruptedException
。抛出此异常时,当前线程的中断状态将被清除。此异常直到此对象的锁定状态已恢复为上述描述的状态才会抛出。- API注释:
-
等待的推荐方法是在调用
wait
时,使用while
循环检查正在等待的条件,如下例所示。这种方法避免了由虚假唤醒引起的问题,等待超时后继续执行适合条件或超时的操作。synchronized (obj) { while (<条件不成立> 并且 <超时未达到>) { long timeoutMillis = ... ; // 重新计算超时值 int nanos = ... ; obj.wait(timeoutMillis, nanos); } ... // 执行适合条件或超时的操作 }
- 参数:
-
timeoutMillis
- 最大等待时间,以毫秒为单位 -
nanos
- 附加时间,以纳秒为单位,范围在0-999999之间 - 抛出:
-
IllegalArgumentException
- 如果timeoutMillis
为负数,或者nanos
的值超出范围 -
IllegalMonitorStateException
- 如果当前线程不是对象监视器的所有者 -
InterruptedException
- 如果在当前线程等待之前或期间,任何线程中断了当前线程。抛出此异常时,当前线程的中断状态将被清除。 - 参见:
- 其他某个线程为此对象调用
-
finalize
Deprecated, for removal: This API element is subject to removal in a future version.Finalization is deprecated and subject to removal in a future release. The use of finalization can lead to problems with security, performance, and reliability. See JEP 421 for discussion and alternatives.Subclasses that override
finalize
to perform cleanup should use alternative cleanup mechanisms and remove thefinalize
method. UseCleaner
andPhantomReference
as safer ways to release resources when an object becomes unreachable. Alternatively, add aclose
method to explicitly release resources, and implementAutoCloseable
to enable use of thetry
-with-resources statement.This method will remain in place until finalizers have been removed from most existing code.
垃圾收集器在确定对象没有更多引用时,会调用对象上的finalize
方法。子类可以重写finalize
方法来处理系统资源的释放或执行其他清理操作。在禁用或移除了终结操作的Java虚拟机中运行时,垃圾收集器永远不会调用
finalize()
。在启用终结操作的Java虚拟机中,垃圾收集器可能会在不确定的延迟后才调用finalize
。finalize
的一般约定是,当Java虚拟机确定没有任何线程可以访问该对象(除了由其他对象或类的终结操作采取的操作外)时,将调用它。finalize
方法可以执行任何操作,包括再次使该对象可供其他线程使用;然而,finalize
的通常目的是在对象被彻底丢弃之前执行清理操作。例如,表示输入/输出连接的对象的终结方法可能执行显式的I/O事务以断开连接,然后才永久丢弃对象。Object
类的finalize
方法不执行任何特殊操作;Object
的子类可以重写此定义。Java编程语言不保证哪个线程会为任何给定对象调用
finalize
方法。但是,保证调用finalize
的线程在调用finalize
时不会持有任何用户可见的同步锁。如果finalize
方法抛出未捕获的异常,则异常将被忽略,并且该对象的终结将终止。在为对象调用
finalize
方法后,直到Java虚拟机再次确定没有任何线程可以访问该对象(包括其他对象或类可能采取的终结操作),才会采取进一步操作,此时对象可能会被丢弃。Java虚拟机永远不会为任何给定对象多次调用
finalize
方法。finalize
方法抛出的任何异常都会导致该对象的终结被停止,但否则会被忽略。- API注释:
-
包含非堆资源的类有许多清理这些资源的选项。该类必须确保每个实例的生命周期长于任何嵌入的资源。可以使用
Reference.reachabilityFence(java.lang.Object)
来确保对象在嵌入在对象中的资源正在使用时仍然可访问。子类应避免重写
finalize
方法,除非子类嵌入了必须在实例被收集之前清理的非堆资源。终结器调用不会自动链接,不像构造函数。如果子类重写finalize
,则必须显式调用超类终结器。为防止异常过早终止终结链,子类应使用try-finally
块确保始终调用super.finalize()
。例如,@Override protected void finalize() throws Throwable { try { ... // 清理子类状态 } finally { super.finalize(); } }
- 抛出:
-
Throwable
- 该方法引发的Exception
- 参见Java语言规范:
-
12.6 类实例的终结
- 参见:
-