Java的Object类
Object 类
Object 类在 JDK1.8 的 API 中是这么定义的:
public class Object
Class
Object
is the root of the class hierarchy. Every class hasObject
as a superclass. All objects, including arrays, implement the methods of this class.
Object 类的方法
Method | Description |
---|---|
protected Object clone() | 创造并返回这个对象的复制 |
boolean equals(Object obj) | 指示某个其他对象是否“等于”此对象 |
protected void finalize() | 当垃圾回收确定没有对该对象的引用时,由对象上的垃圾收集器调用 |
Class<?> getClass() | 返回这个对象的运行时类 |
int hashCode() | 返回这个对象的哈希码 |
void notify() | 唤醒在该对象监视器上的一个单线程 |
void notifyAll() | 唤醒在该对象监视器上的所有线程 |
String toString() | 返回该对象的字符串表示 |
void wait() | 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法 |
void wait(long timeout) | 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法,或者超过了指定的时间 |
void wait(long timeout, int nanos) | 导致当前线程进入等待,直到另一个线程调用这个对象的 notify() 或者 notifyAll() 方法,或者某个其他线程中断当前线程,或者超过了指定的时间 |
方法详解
getClass
1 | public final Class<?> getClass() |
- 返回此
Object
运行时类的Class
对象。返回的Class
对象是由所表示类的static synchronized
方法锁定的对象。
hashCode
1 | public int hashCode() |
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如
java.util.Hashtable
提供的哈希表)的性能。hashCode 的常规协定是:
- 在 Java 应用程序执行期间,在对同一对象多次调用
hashCode
方法时,必须一致地返回相同的整数,前提是将对象进行equals
比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 - 如果根据
equals(Object)
方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode
方法都必须生成相同的整数结果。 - 如果根据
equals(java.lang.Object)
方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode
方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
- 在 Java 应用程序执行期间,在对同一对象多次调用
equals
1 | public boolean equals(Object obj) |
- 指示其他某个对象是否与此对象“相等”。如果此对象与 obj 参数相同,则返回
true
;否则返回false
。 equals
方法在非空对象引用上实现相等关系:- 自反性:对于任何非空引用值
x
,x.equals(x)
都应返回true
。 - 对称性:对于任何非空引用值
x
和y
,当且仅当y.equals(x)
返回true
时,x.equals(y)
才应返回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
。
- 自反性:对于任何非空引用值
- 该方法比较的是引用,对于任何非空引用值
x
和y
,当且仅当x
和y
引用同一个对象时,此方法才返回true
(x == y
具有值true
)。 - 很多类对该方法进行了重写,以实现比较对象实际内容的功能,这里需要注意的是:当此方法被重写时,通常有必要重写
hashCode
方法,以维护hashCode
方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
clone
1 | protected Object clone() throws CloneNotSupportedException |
- 创建并返回此对象的一个复制。“复制”的准确含义可能取决于对象的类。
- 如果对象的类不支持
Cloneable
接口,则重写clone
方法的子类也会抛出此异常,以指示无法复制某个实例。 - 该方法执行的是对象的”浅拷贝”,即对象本身没有被复制。
Object
类本身不实现接口Cloneable
,所以在类为Object
的对象上调用clone
方法将会导致在运行时抛出异常。但所有的数组都被视为实现接口Cloneable
。
toString
1 | public String toString() |
返回该对象的字符串表示。通常,
toString
方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。Object
类的toString
方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:1
getClass().getName() + '@' + Integer.toHexString(hashCode())
notify
1 | public final void notify() |
- 唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。
- 此方法只应由作为此对象监视器的所有者的线程来调用。
- 如果当前线程不是此对象监视器的所有者,抛出
IllegalMonitorStateException
异常。
notifyAll
1 | public final void notifyAll() |
- 唤醒在此对象监视器上等待的所有线程。
此方法只应由作为此对象监视器的所有者的线程来调用。
如果当前线程不是此对象监视器的所有者,抛出
IllegalMonitorStateException
异常。
wait
1 | public final void wait(long timeout) throws InterruptedException |
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
此方法只应由作为此对象监视器的所有者的线程来调用。
- 抛出:
IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
1 | public final void wait(long timeout) throws InterruptedException |
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,或者超过指定的时间量前,导致当前线程等待。
此方法只应由作为此对象监视器的所有者的线程来调用。
参数:
timeout
- 要等待的最长时间(以毫秒为单位)。
抛出:
IllegalArgumentException
- 如果超时值为负。IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
1 | public final void wait(long timeout, int nanos) throws InterruptedException |
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,或者其他某个线程中断当前线程,或者超过指定的时间量前,导致当前线程等待。
此方法只应由作为此对象监视器的所有者的线程来调用。
参数:
timeout
- 要等待的最长时间(以毫秒为单位)。nanos
- 额外时间(以毫微秒为单位,范围是 0-999999)。
抛出:
IllegalArgumentException
- 如果超时值是负数,或者毫微秒值不在 0-999999 范围内。IllegalMonitorStateException
- 如果当前线程不是此对象监视器的所有者。InterruptedException
- 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态被清除。
finalize
1 | protected void finalize() throws Throwable |
- 当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。子类重写
finalize
方法,以配置系统资源或执行其他清除。 - 对于任何给定对象,Java 虚拟机最多只调用一次
finalize
方法。 finalize
方法抛出的任何异常都会导致此对象的终结操作停止,但此外的都会被忽略。Throwable
- 此方法抛出的 Exception