Java的Object类
Object 类
Object 类在 JDK1.8 的 API 中是这么定义的:
public class Object
Class
Objectis the root of the class hierarchy. Every class hasObjectas 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